我正在开发一个需要运行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?
答案 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);
};