【问题标题】:app.use() requires middleware functions app.use( seneca.export('web') );app.use() 需要中间件函数 app.use(seneca.export('web') );
【发布时间】:2017-02-23 00:01:24
【问题描述】:

我是 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,但仍然出现相同的错误

【问题讨论】:

  • 您是否尝试过 here 或 here 的 Express 示例?
  • 在第一个链接上,我也收到错误消息。指着地图关键词说,意外识别。在第二个链接上,我没有任何错误,但它并没有尝试将 seneca 作为中间件加载到 express 中
  • 基本上没有在 SO 或 github 上找到的示例现在正在工作,这是可复制的。
  • 天哪,一点都不酷。我现在迷失了塞内卡。嘿,谢谢下面的回答,你能推荐资源,这样我就可以真正开始使用 seneca js 了吗?
  • 老实说,为了在某个时候回答这个问题,我只是停止环顾四周,转而寻找源头。例如,下面答案中的代码我从seneca-web tests 之一适应了您的情况,我认为他们仍在通过它们。此外,一旦你设置好并让你的服务器启动并运行,你应该很好地使用我认为的现有资源 - 如果没有,只需发布​​一个问题 :) -.

标签: node.js seneca


【解决方案1】:

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

default_plugins: {
    transport: true
}

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

您必须首先明确告诉seneca 将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!"}

【讨论】:

  • 进一步改进这个答案。现在 seneca 需要快速表达“Seneca Web Adaptor Connect”。因此,此答案更改了一行以使其正常工作,即:seneca.use(Web, { adapter: require('seneca-web-adapter-express'), context: server }) 不要忘记安装npm install --save seneca-web-adapter-express
猜你喜欢
  • 2015-12-08
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多