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

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的调用。现在我不确定该怎么做。

我尝试将我的node版本从6.0降至4.0,但仍然遇到了同样的错误。


你尝试过从这里或者这里的Express示例吗? - mscdex
在第一个链接中,我也遇到了一个错误。它指向地图关键字并说出现了意外标识符。在第二个链接中,我没有任何错误,但它没有尝试在express中加载seneca作为中间件。 - chip
基本上,我在Stack Overflow或GitHub上找到的所有示例现在都无法正常工作,而且这是可再现的。 - cviejo
哦,那真的不太好。我现在对Seneca感到迷茫。嘿,谢谢你下面的答案,你能推荐一些资源让我真正开始使用Seneca js吗? - chip
说实话,回答这个问题的时候,我有一段时间停止了四处寻找,转而去查阅源代码。例如下面的答案中的代码,我是从 seneca-web tests 中的一个适应你的情况的代码中改编而来的,我想它们仍然可以通过测试。此外,一旦你设置好并运行你的服务器,我认为你应该可以使用现有的资源 - 如果不行,就发一个问题吧 :) -。 - cviejo
1个回答

11

看一下主要的seneca.js文件,你会发现只有transport被列为默认插件(而不是web):

default_plugins: {
    transport: true
}
因此,该行代码app.use(seneca.export('web'));向express传递了undefined作为中间件,因此您遇到了错误。
您必须首先明确告诉seneca使用带有您的express服务器参数的web插件。尝试这样做:
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!"}


3
为了进一步改进这个答案,现在Seneca需要使用"Seneca Web Adapter Connect"表达。因此,这个答案改变了一行代码,使得它可以工作,即: seneca.use(Web, { adapter: require('seneca-web-adapter-express'), context: server })别忘了安装 npm install --save seneca-web-adapter-express - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接