将param传递给自定义中间件

时间:2014-12-29 13:26:15

标签: node.js express

我有一些中间件可以检查用户是否已登录:

//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传递给中间件以便它也可以使用第三方服务?

2 个答案:

答案 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
  }
}