คุณสามารถสร้างบางอย่างที่คล้ายกันเพื่อ middleware โรงงาน:
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
});
ยังตรวจสอแสดงออก docs: การเขียน middleware สำหรับใช้ในแสดงออก apps ต้องเข้าใจว่ามันคืออะไร next
แล้วมันได้ผล(ฉันสังเกตเห็นคุณไม่ได้ใช้มันอยู่ในความพยายาม).
ยังผมคิดว่าคุณคงมีไม่กี่ typos:
select('+password')
-คุณแน่ใจหรืออีกอย่างเป็นจำเป็นด้วยเหรอ?
findOne({_id: id})
-ควรจะเป็น findOne({_id: user})
? หรือทำไมคุณถึงกำหนดไว้ user
ไม่อย่างนั้น?
พีเอส.และไม่เคยลืมที่จะจัดการเกิดข้อผิดพลาด:)
res.locals
แทนที่จะต้องโดยตรงreq
. นี่มันนิสัยอาจจะใช้แทนที่สำคัญตัวแปรในreq
วัตถุ.