I'm a noob at seneca and I'm just trying to run sample codes from Developing Microservices with Node js, and it says:
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);
but Im getting an error that says:
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
Also I tried to run another sample code copied from the web, I'm sorry I just can find the link. But I just copied, pasted and tried to run and I got the same error. I'm thinking this is more of a setup issue?
edit
I'm still trying to play with this. The way I understand this is that on app.use line, basically I'm just calling the seneca-web module. so what I did was
app.use(require('seneca-web'))
instead of
app.use( seneca.export('web') )
then I ran node app.js
, it ran the script with no error in the command.
but when tried to access the module from a browser, then I got the error saying util is not found and is pointing to the seneca web file, which actually is from a call from seneca. now I'm not sure what to do now
I tried to lower the version of the node version that I have to 4.0 from 6.0, but still got the same error
Taking a look the main seneca.js file, you'll see that only transport
is listed as default plugin (not web
):
default_plugins: {
transport: true
}
The line app.use(seneca.export('web'));
is therefore passing undefined
to express as a middleware, thus the error you are experiencing.
You have to first explicitely tell seneca
to use the web
plugin with your express server as parameter. Try this:
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!"
});
}
Calling http://localhost:3000/my-api/bazinga in the browser yields
{"bar":"Bazinga!"}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With