我正在尝试使用Node和Express编写POST端点,该端点为用户创建一个新帐户。在我的函数中,我正在执行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操作?
除非调用如下所示提供的下一个变量,否则中间件链不会在Express.js中自动继续:
router.post('/createUser', function (req, res, next) { next(); }
创建诺言时,返回仅属于诺言,而不会终止Express函数的执行。当您检查时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){
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句