Экспресс-js с использованием двух промежуточных программ для одного маршрута

#node.js #express #middleware

#node.js #экспресс #промежуточное программное обеспечение

Вопрос:

У меня есть свой маршрут router.post('/invite', adminAuth, async (req, res) => { , и мне нужно дополнительное промежуточное программное обеспечение для этого маршрута. Пример — adminAuth открывает этот маршрут для администратора и, если активирована подписка администратора. Но если администратор пользователя и подписка отменены, мне все равно нужно иметь возможность открыть для него этот маршрут.

Я пытаюсь так router.post('/invite', [adminAuth, addMiddleware], async (req, res) => {

Но это все еще не работает.

Мое промежуточное программное обеспечение adminAuth выглядит следующим образом

   const token = req.headers['x-access-token'] || req.headers.authorization;

  if (!token)
    return res
      .status(401)
      .json({ success: false, message: 'Access denied. No token provided.' });

  try {
    req.user = jwt.verify(token, config.get('secretToken'));

    if (
      req.user.userType === USER_TYPES.ADMIN amp;amp;
      req.user.isStripeSubscriptionActive
    ) {
      next();
    } else {
      return res.status(401).json({
        success: false,
        message:
          'User is not admin or subscription was canceled! P.S. MIDDLEWARE.',
      });
    }
  } catch (ex) {
    return res.status(401).json({
      success: false,
      message: 'Invalid token P.S. MIDDLEWARE.',
    });
  }
};

 module.exports = {
    adminAuth,  
};```
 

Комментарии:

1. Вы пробовали это: router.post('/invite', adminAuth, addMiddleware, async (req, res) => {

2. @jfriend00 да, все еще работает первое промежуточное программное обеспечение, а второе даже не тронуто 🙁

3. Понимаете ли вы , что второму звонят ТОЛЬКО в том случае , если звонит первый next() ? Если вы отправляете ответ и не вызываете next() , то запрос выполняется, и промежуточное программное обеспечение больше не вызывается. Итак, я бы посоветовал вам добавить console.log() вызовы к первому, чтобы вы могли точно отследить, куда ведет его логика, и убедиться, что он вызывает next() .

4. @jfriend00 итак, сначала проверьте, является ли пользователь администратором и подпиской == true, если не первый ответ промежуточного ПО, а второй даже не затронут, поэтому мне нужно написать одно промежуточное ПО для обоих случаев? если использовать admin и subscription == true, а user admin и subscription == false?

5. Если логике нужны обе части информации для принятия решения, то вы, вероятно, захотите объединить их в одно промежуточное программное обеспечение. Я не понимаю, какую логику вы пытаетесь реализовать, поэтому я не могу дать более конкретную рекомендацию.