Javascript 为什么不使用参数调用此Express中间件?
我正在开发一个需要运行Javascript 为什么不使用参数调用此Express中间件?,javascript,node.js,express,middleware,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 otherm
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仍然以相同的方式工作):
为什么调用othermiddleware
时没有参数?因为您这样做了
next();
不传递参数。我通常是这样做的:
bodyParser.json()(
req,
res,
() => {
othermiddleware(req,res,next);
}
);
或者使用一些绑定魔法:
bodyParser.json()(req, res, othermiddleware.bind(this,req,res,next));
因为你知道
next();
不传递参数。我通常是这样做的:
bodyParser.json()(
req,
res,
() => {
othermiddleware(req,res,next);
}
);
或者使用一些绑定魔法:
bodyParser.json()(req, res, othermiddleware.bind(this,req,res,next));
问题是,
bodyParser.json()
返回的中间件只需像这样调用next()
(即没有参数)。在这里,您将传递othermiddleware
作为bodyParser.json()
返回的中间件的旁边。因此,它不包含任何参数
此外,bodyParser不会更改req/res
对象的原始引用。因此主req/res
对象仍然引用同一个对象。因此,您不需要传递参数。您也可以在othermiddleware
函数中使用相同的req/res
对象
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);
};
问题是,
bodyParser.json()
返回的中间件只需像这样调用next()
(即没有参数)。在这里,您将传递othermiddleware
作为bodyParser.json()
返回的中间件的旁边。因此,它不包含任何参数
此外,bodyParser不会更改req/res
对象的原始引用。因此主req/res
对象仍然引用同一个对象。因此,您不需要传递参数。您也可以在othermiddleware
函数中使用相同的req/res
对象
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);
};
我相信
bodyParser.json()
返回的中间件只需像这样调用next()
(即不带参数)。这里,您将othermiddleware
作为next
传递给bodyParser.json()
返回的中间件。所以它不包含任何参数。你完全正确。我的同事也指出了这一点。如果你这样回答,我会接受。为什么要投反对票?我相信bodyParser.json()
返回的中间件只需像这样调用next()
(即没有参数)。这里,您将othermiddleware
作为next
传递给bodyParser.json()
返回的中间件。所以它不包含任何参数。你完全正确。我的同事也指出了这一点。如果你这样回答,我会接受。为什么投反对票?IIRC bodyparser会在req对象中添加一个body对象。@dlow它会在req对象中添加一个body
属性。它不会更改req
对象的引用。这就是我写的。IIRC bodyparser将一个body对象添加到req对象。@dLow它将一个body
属性添加到req
对象。它不会更改req
对象的引用。这就是我写的。