आप कर सकते हैं बनाने के लिए कुछ इसी तरह मिडलवेयर कारखाने:
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
और यह कैसे काम करता है (मैंने देखा है कि आप का उपयोग नहीं किया यह अपने प्रयास में).
यह भी मुझे लगता है कि आप कुछ typos:
select('+password')
- आप यकीन कर रहे हैं प्लस आवश्यक है?
findOne({_id: id})
- होना चाहिए findOne({_id: user})
? या क्यों आप परिभाषित user
अन्यथा?
P. S. ... और कभी नहीं भूल करने के लिए संभाल त्रुटियों :)
res.locals
के बजाय करने के लिए सीधेreq
. इस आदत को ओवरराइड हो सकता महत्वपूर्ण चर मेंreq
वस्तु.