你可以创建类似于中间件工厂:
const checkPassword = (returnPassword = false) => {
return (req, res, next) => {
User.findOne({_id: req.body_id })
.select('+password')
.exec((err, result) => {
if (err) {
console.error(err);
return res.status(500).send() // End of request on error?
} else {
const password = result['password'] // get your password this way or somehow else
if (returnPassword) {
// Store password in request if returnPassword=true
res.locals.userPassword = password;
}
next();
}
})
}
}
使用:
router.get('/A', checkPassword(true), routeA)
router.get('/B', checkPassword(false), routeB)
访问在路线:
router.get('/', (req, res) => {
console.log(res.locals.userPassword) // Actual password for /A, undefined for /B
});
还检查了表达文档: 编写中间用于快速应用程序的 理解是什么 next
及它是如何工作(我注意到你没有利用它在你的尝试).
此外,我猜你有几个错别字:
select('+password')
-你确定加是必要的?
findOne({_id: id})
-应该是 findOne({_id: user})
? 或者为什么你一定义 user
否则?
P.S....永远不会忘记处理错误:)
res.locals
而不是直接req
. 这种习惯可替代的重要变量req
对象。