我实际上有几个关于Express中间件链接的问题,并且认为我会将它们分组在这一篇文章中,因为它们密切相关。
Q1:在中间件函数中,如果我send()
Response
,传递给下一个函数,或者只是返回,是否会执行剩余的任何代码?
router.get('/a', (req, res, next) => {
res.sendStatus(200);
// Does this ever get executed?
});
router.get('/b', (req, res, next) => {
next();
// Does this ever get executed?
});
router.get('/c', (req, res, next) => {
return;
// Does this stop the middleware chain? What happens to the request/response?
});
Q2:你可以从前一个中传到另一个中间件函数吗?我的理由是我必须提供一个参数来创建某个中间件,该参数取决于哪个Express app
对象是Request
的所有者。所以我需要访问Request的属性,然后才能将其传递给需要使用该属性创建的中间件。这会有用吗??
router.get('/d', (req, res, next) => {
var middlewareFunction = createDynamicMiddleware();
middlewareFunction(req, res, next); // Will this still work as expected?
});
问题3:当您在没有任何参数的情况下调用Request
时,Response
/ next()
参数如何传递给下一个中间件?
答案 0 :(得分:0)
Q1 :在中间件函数中,如果我发送()响应,传递给下一个函数,或者只是返回,其余任何代码都会得到 执行?
router.get('/a', (req, res, next) => {
res.sendStatus(200);
// Does this ever get executed?
// Yes, but don't call next() or res.send() or it will throw an error
});
router.get('/b', (req, res, next) => {
next();
// Does this ever get executed?
// Yes, but don't call next() or res.send() or it will throw an error
});
router.get('/c', (req, res, next) => {
return;
// Does this stop the middleware chain? What happens to the request/response?
// The request get stuck and after a while it will fail due 'timeout'
});
Q2 :您可以从前一个中传到另一个中间件功能吗?我的理由是我必须提供一个 创建某个中间件的参数,那个参数是 取决于哪个Express应用程序对象是请求的所有者。所以 我需要在将Request传递给之前访问Request的属性 需要使用该属性创建的中间件。
您的动态中间件工厂应该返回一个新功能
返回新函数的函数也称为curried函数,这是一个实际的例子:
// based on 'someId' we will return a specific middleware
req.get('/user/:someId',
createDynamicMiddleware,
(req,res) => {
res.send('ok')
})
function createDynamicMiddleware(req,res,next){
if(req.params.someId === 'me') {
return function(req, res, next){
// do some stuff if someId is me
return next();
}
} else {
return function(req, res, next){
// do some other stuff otherwise
return next();
}
}
}
Q3 :在没有任何参数的情况下调用next()时,请求/响应参数如何传递给下一个中间件?
快递处理这个给你!
此外,如果向req或res对象添加属性,它将出现在下一个中间件中
例如:
router.get('/', (req,res,next) => {
req.customProperty = 'hello!';
return next();
}, (req, res) => {
console.log(req.myCustomProperty)
// hello!
})