为什么不使用参数调用此Express中间件?

时间:2017-09-15 19:12:58

标签: javascript node.js express middleware

我正在开发一个需要运行bodyParser的中间件,但我不想让应用程序将其作为依赖项。相反,我想制作一个需要它的包并导出这样的中间件:

//routes.js
app.use('/', middlewareWrapper(thing));

//middlware.js
export function middlewareWrapper(thing) {
    return function addBody(req, res, next) {
        function othermiddleware(_req, _res) {
            // do something with thing and _req
            return next();
        }
        return bodyParser.json()(req, res, othermiddleware);
    };
}

看起来它会起作用,othermiddleware被调用,但没有参数。

我发现另一个答案以基本相同的方式解决了这个问题(它已经过时了,但JS的工作方式仍然相同):https://stackoverflow.com/a/17997640/444871

为什么调用othermiddleware时没有args?

2 个答案:

答案 0 :(得分:1)

因为你做了

next();

没有传递参数。通常快递是这样的:

bodyParser.json()(
  req,
  res,
  () => {
    othermiddleware(req,res,next);
  }
);

或者你使用一些绑定魔法:

bodyParser.json()(req, res, othermiddleware.bind(this,req,res,next));

答案 1 :(得分:1)

问题是bodyParser.json()返回的中间件只是像这样调用next()(即没有参数)。在这里,您将othermiddleware传递给bodyParser.json()返回的中间件旁边。因此它不包含任何参数。

bodyParser也不会更改req/res对象的原始引用。所以主req/res对象仍然引用同一个对象。所以你不需要传递参数。您也可以在req/res函数中使用相同的othermiddleware对象。

return function addBody(req, res, next) {
        function othermiddleware() {
            // You should be able to use req and res modified by bodyParser.
            // You dont need arguments to be passed.
            return next();
        }
        return bodyParser.json()(req, res, othermiddleware);
    };