Você pode criar algo semelhante ao middleware de fábrica:
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();
}
})
}
}
Uso:
router.get('/A', checkPassword(true), routeA)
router.get('/B', checkPassword(false), routeB)
Acesso em rotas:
router.get('/', (req, res) => {
console.log(res.locals.userPassword) // Actual password for /A, undefined for /B
});
Confira também Express documentos: a Escrita de middleware para uso em serviço Expresso de apps para entender o que é next
e como ele funciona (eu percebi que você não usá-lo em sua tentativa).
Também eu acho que você tem alguns erros de ortografia:
select('+password')
- tem certeza de mais é necessário?
findOne({_id: id})
- deve ser findOne({_id: user})
? Ou por que você definiu user
de outra forma?
P. S. ... e nunca se esqueça de lidar com os erros :)
res.locals
em vez de diretamente parareq
. Este hábito pode substituir variáveis importantes nareq
objecto.