#node.js #express #middleware #express-router
#node.js #экспресс #промежуточное программное обеспечение #экспресс-маршрутизатор
Вопрос:
У меня есть маршрут экспресс-маршрутизатора следующим образом:
.post(
authController.protect,
itemController.createItem, //create Item
itemController.sendNotification('new-item'), //if user exists send notification
);
контроллер CreateItem имеет некоторую логику, которая может запускать sendNotifications с типом (‘new-match’) и, если пропущено, перейдет к следующему контроллеру, используя next()
следующее:
if(foo) next()
else sendNotifications('new-match')
промежуточное программное обеспечение my sendNotifications определяется следующим образом:
const sendNotification = type =>
catchAsync(async (req, res, next) => {
if (req.userFound) {
await Notification.create({ user: req.userFound, notType: type });
const user = await User.findByIdAndUpdate(req.userFound, {
$inc: { notifications: 1 }
});
req.userFoundEmail = user.email;
}
next();
});
exports.sendNotification = sendNotification;
Моя проблема в том, что когда промежуточное программное обеспечение sendNotifications индуцируется из стека маршрутов, к которому оно будет иметь доступ req,res,next
, но когда оно вызывается из самого контроллера req,res,next
undefined
Я вызываю sendNotification изнутри контроллера, как описано выше:
sendNotification('new-match');
Как я могу предоставить доступ к req, res, next обоими способами?
Комментарии:
1. Что такое
catchAsync
? Ваше промежуточное программное обеспечение передается ему в качестве аргумента2. это просто метод обработчика try catch. так что без этого моя функция была бы
const sendNotification = type => async (req, res, next) => { if (req.userFound) { await Notification.create({ user: req.userFound, notType: type }); const user = await User.findByIdAndUpdate(req.userFound, { $inc: { notifications: 1 } }); req.userFoundEmail = user.email; } next(); }; exports.sendNotification = sendNotification;