5

我是 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() 需要中间件函数
    在 EventEmitter.use (/home/oem/node_modules/express/lib/application.js:209:11)
    在对象。(/home/oem/Documents/seneca/app.js:7:8)
    在 Module._compile (module.js:409:26)
    在 Object.Module._extensions..js (module.js:416:10)
    在 Module.load (module.js:343:32)
    在 Function.Module._load (module.js:300:12)
    在 Function.Module.runMain (module.js:441:10)
    启动时 (node.js:139:18)
    在 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 降低到 4.0,但仍然出现相同的错误

4

1 回答 1

11

查看主seneca.js 文件,您会看到它仅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!"}

于 2016-09-23T11:12:14.763 回答