Почему моя функция не завершается при указании возврата (Node.js и Express.js )

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Я пытаюсь написать конечную точку POST, используя Node и Express, которая создает новую учетную запись для пользователя. В моей функции я выполняю 2 вызова базы данных. Первый проверяет, чтобы убедиться, что электронное письмо, отправленное пользователем в запросе, не существует в базе данных, а второй вставляет пользователя, если первая функция возвращает значение false:

         UserService.checkDupEmail(db, user.email)
            .then((result) => {
                if (result === true) {
                    const message = 'Email already exists.';
                    return res
                        .status(400)
                        .json('Error: '   message)
                };
            });
        
        const table = 'users';
        BaseService.post(db, table, user)
            .then((user) => {
                Response.created(res, user);
            })
            .catch(next)
 

Если первый вызов возвращается как истинное значение, электронное письмо уже существует, я хочу немедленно вернуть ответ с кодом ошибки и сообщением JSON о том, что электронное письмо существует. Происходит то, что отправляется ответ, но функция продолжает пытаться выполнить второй вызов базы данных, который, конечно, завершается неудачей, потому что электронное письмо уже существует.

Если я не ошибаюсь, я считаю, что именно так должны работать Express и промежуточное программное обеспечение, верно? Предполагается, что это цепочка проверок и промежуточного программного обеспечения, которая, пока они проходят, продолжается по цепочке до последней операции CRUD?

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

1. Функция, которая является .then() обратным вызовом, завершается немедленно. Однако завершение этой функции не завершает внешнюю функцию почти так же, как это foo(); return true; не заканчивается, foo() если она содержит a return .

Ответ №1:

Цепочки промежуточного программного обеспечения не продолжаются автоматически в Express.js если только вы не вызовете следующую указанную переменную, как показано ниже:

 router.post('/createUser', function (req, res, next) { next(); }
 

Когда вы создаете обещание, возврат принадлежит только обещанию, не завершающему выполнение вашей экспресс-функции. Поскольку вы проверяете наличие result === true , я бы создал else для выполнения, не найдя результат в базе данных, и добавил туда нового пользователя. Я бы изменил ваш код на:

     UserService.checkDupEmail(db, user.email)
                .then((result) => {
                    if (result === true) {
                        const message = 'Email already exists.';
                        return res
                            .status(400)
                            .json('Error: '   message)
                    } else {
                       const table = 'users';
                       BaseService.post(db, table, user)
                         .then((user) => {
                             Response.created(res, user);
                          })
                         .catch(next)
                   }
                }).catch(next){

                };
            
       
 

Ответ №2:

UserService.checkDupEmail(db, user.email) возвращает обещание. Обратный вызов, добавленный с помощью then(), будет вызван после завершения UserService.checkDupEmail.

     (result) => {
        if (result === true) {
            const message = 'Email already exists.';
            return res
                .status(400)
                .json('Error: '   message)
        };
    }
 

выше приведена ваша функция обратного вызова.

возврат, о котором вы говорите, — это возврат функции обратного вызова. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises