Można stworzyć coś podobnego do fabryki oprogramowania pośredniego:
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();
}
})
}
}
Zastosowanie:
router.get('/A', checkPassword(true), routeA)
router.get('/B', checkPassword(false), routeB)
Dostęp na trasach:
router.get('/', (req, res) => {
console.log(res.locals.userPassword) // Actual password for /A, undefined for /B
});
Zapoznaj się także z szybkich dokumentami: Pisanie oprogramowania pośredniego do użytku w szybkich aplikacjach, aby zrozumieć, co to jest next
i jak to działa (zauważyłem, że nie użył go w swojej próbie).
Poza tym, myślę, że masz kilka literówek:
select('+password')
- jesteś pewien, że plus jest wymagany?
findOne({_id: id})
- musi być findOne({_id: user})
? Lub dlaczego ustaleniu user
inaczej?
P. S. ... i nigdy nie zapomnij, aby poprawić błędy :)
res.locals
zamiast bezpośrednio kontaktować sięreq
. Ten nawyk może zastąpić ważne zmienne wreq
obiekt.