Вызовы промежуточного программного обеспечения в express не прекращаются после возврата внутрь одного из них - PullRequest
0 голосов
/ 26 мая 2020

У меня проблемы с промежуточным программным обеспечением в моем приложении express, у меня есть следующий маршрут:

app.post(
    '/api/auth/signup',
    [
        verifySignUp.checkDuplicateUsernameOrEmail,
        verifySignUp.checkRolesExist
    ],
    controller.signup
);

Есть два промежуточного программного обеспечения checkDuplicateUsernameOrEmail и checkRolesExist следующим образом:

const checkDuplicateUsernameOrEmail = (req, res, next) => {
  console.log('checkDuplicateUsernameOrEmail');
  User.findOne({username: req.body.username}).exec()
    .then(user => {
      if (user) {
        console.log("user name exists");
        return fail(res, {message: 'This username already exists'});
      }
      return User.findOne({email: req.body.email}).exec()
    })
    .then(user => {
      if (user) {
        return fail(res, {message: 'This email already exists'});
      }
      next();
    })
    .catch(error => {
      console.log(error);

      fail(res, {message: 'Database internal error occured.'});
    });
};

const checkRolesExist = (req, res, next) => {
  console.log('checkRolesExist');
  console.log(req.body.roles);
    for (const role of req.body.roles) {
      if (!ROLES.includes(role)) {
        return fail(res, {message: `${role} is not a valid role`});
      }
    }
    next();
};

const fail = (res, err) => {
  const message = err.message || 'Encountered a server error';
  const status = err.status || 500;
  res.status(status).json({status, message});
}

Я делаю запрос с именем пользователя, которое уже использовалось ранее, и в консоли я получаю user name exists, как и ожидалось, однако приложение продолжает вызывать checkRolesExist, выполнение промежуточного программного обеспечения не должно останавливаться, когда оно попадает возвращение? Что я делаю не так где?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Это потому, что return fail возвращается в ... ничто. вы возвращаете материал внутри функции обратного вызова then(), а не внутри checkDuplicateUsernameOrEmail(). Итак, исполнение продолжается, и вы выбираете следующий стиль .then().

Go async/await, это облегчит вашу жизнь:

const checkDuplicateUsernameOrEmail = async(req, res, next) => {

    console.log('checkDuplicateUsernameOrEmail');

    try {
        if ( await User.findOne({ username: req.body.username }).exec() ) {
            console.log("user name exists");
            return fail(res, { message: 'This username already exists' });
        }

        if ( await User.findOne({ email: req.body.email }).exec()) {
            return fail(res, { message: 'This email already exists' });
        }
        next();

    } catch (error) {

        console.log(error);
        fail(res, { message: 'Database internal error occured.' });
    }
};
0 голосов
/ 26 мая 2020

Если вы хотите, чтобы они выполнялись в указанном c порядке, чтобы checkRolesExist не запускался, если первый не прошел, сделайте следующее:

app.post(
    '/api/auth/signup',
    verifySignUp.checkDuplicateUsernameOrEmail,
    verifySignUp.checkRolesExist,
    controller.signup
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...