我有一些中间件可以检查用户是否已登录:
//mw.js
module.exports = {
auth: function(req, res, next) {
//check if user is logged in here
}
}
我有一个单独的路由文件,接受用于拨打第三方服务的client
:
//routes.js
module.exports = function(app,client) {
router.get('/', mw.auth, function (req, res) {
});
}
正如您所看到的,该路由使用了中间件但是如何将client
传递给中间件以便它也可以使用第三方服务?
答案 0 :(得分:4)
将参数/配置选项传递给中间件的首选方法是从中间件返回一个函数,该函数使用闭包来捕获参数。
//mw.js
module.exports = {
auth: function (client) {
return function (req, res, next) {
//use client
};
}
}
...
//routes.js
module.exports = function(app,client) {
router.get('/', mw.auth(client), function (req, res) {
});
}
例如,static file server middleware将基目录作为参数。
以下是我实施json-rpc的摘录。它捕获方法对象,并在请求到达时调用方法。
var JsonRpcServer = require('./rpc-server');
module.exports = function jsonrpc (methods) {
var jsonRpcServer = new JsonRpcServer(methods);
return function(req, res, next) {
var rpcResponse,
rpcRequest = req.body,
contentType = req.headers['content-type'];
if(req.method === 'POST' && ~contentType.indexOf('application/json')) {
rpcResponse = jsonRpcServer._handleRpc(rpcRequest);
if(Array.isArray(rpcResponse) && rpcResponse.length || rpcResponse.id) {
rpcResponse = JSON.stringify(rpcResponse);
res.writeHead(200, {
'Content-Length': String(Buffer.byteLength(rpcResponse)),
'Content-Type': contentType
});
res.end(rpcResponse);
}
else {
res.end();
}
}
else next();
};
};
答案 1 :(得分:2)
您可以将其附加到app
:
//routes.js
module.exports = function(app,client) {
app.client = client;
router.get('/', mw.auth, function (req, res) {
});
}
//mw.js
module.exports = {
auth: function(req, res, next) {
//check if user is logged in here
// use `req.app.client` here
}
}