app.use()需要中间件函数app.use(seneca.export('web'));

时间:2016-09-13 22:37:52

标签: node.js seneca

我是seneca的菜鸟,我只是想尝试使用Node js从开发微服务中运行示例代码,它说:

var seneca = require('seneca')();

seneca.add('role:api,cmd:bazinga',function(args,done){
    done(null,{bar:"Bazinga!"});
});

seneca.act('role:web',{use:{
    prefix: '/my-api',
    pin: {role:'api',cmd:'*'},
    map:{
    bazinga: {GET: true}
    }
    }})

var express = require('express');
var app = express();

app.use( seneca.export('web') ); // <<<<<< this line might be the cause 
app.listen(3000);

但我收到的错误是:

TypeError: app.use() requires middleware functions
    at EventEmitter.use (/home/oem/node_modules/express/lib/application.js:209:11)
    at Object. (/home/oem/Documents/seneca/app.js:7:8)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:974:3

此外,我尝试运行从网络上复制的另一个示例代码,对不起,我只是可以找到该链接。但我只是复制,粘贴并试图运行,我得到了同样的错误。我认为这更像是一个设置问题?

修改

我还在尝试玩这个。我理解这一点的方式是在app.use行,基本上我只是调用seneca-web模块。所以我做的是

app.use(require('seneca-web'))

而不是

app.use( seneca.export('web') )

然后我运行node app.js,它运行脚本,命令中没有错误。 但是当试图从浏览器访问模块时,我得到错误,说找不到util,并且指向seneca web文件,实际上是来自seneca的调用。现在我不知道该怎么做

我尝试将6.0版本的节点版本从6.0降低到4.0,但仍然出现同样的错误

1 个答案:

答案 0 :(得分:11)

看一下主seneca.js file,您会看到只有transport被列为默认插件(不是web):

default_plugins: {
    transport: true
}

因此,app.use(seneca.export('web'));行传递undefined表示为中间件,因此您遇到了错误。

您必须首先明确告诉senecaweb插件与您的快速服务器一起用作参数。试试这个:

var Seneca  = require("seneca");
var Express = require("express");
var Web     = require("seneca-web");

var seneca = Seneca();
var server = Express();

var config = {
    routes:{
        prefix : "/my-api",
        pin: "role:api,cmd:*",
        map:{
            bazinga: {
                GET: true
            }
        }
    }
};

seneca.use(Web, { adapter: "express", context: server })
seneca.act("role:web", config);
seneca.add("role:api,cmd:bazinga", bazinga);

server.listen(3000);


function bazinga(args, done){

    done(null, {
        bar: "Bazinga!"
    });
}

在浏览器中调用http://localhost:3000/my-api/bazinga会产生 {"bar":"Bazinga!"}