#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()
если она содержит areturn
.
Ответ №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