于是,我开始了我的 nodejs 之旅。我有使用其他语言的经验,但 promises 概念对我来说很陌生。
我的nodejs环境是expressjs + sequelize。
我正在创建一个基本的寄存器流程,但我遇到了一个基本问题:如何在 then
router.post('/new', function(req, res, next) {
/* some code here */
db.user
.findOne({email: req.body.email})
.then(user =>{
console.log(user);
if(user){
console.log('Info: Email "'+req.body.email+'" already exists.');
res.json( {
meta:{
success: false,
message: 'Email "'+req.body.email+'" already exists.',
}
});
return; // <------
}
})
.catch(err =>{
console.log(err);
return; // <------
});
db.user.create({ /* ... */});
});
基本上我想要的是在用户已经存在时停止处理。我(认为)知道我可以将 create 移到 findOne 中,但感觉不对。
router.post('/new', function(req, res, next) {
db.user
.findOne({email: req.body.email})
.then(user =>{
if(user){
console.log('Info: Email "'+req.body.email+'" already exists.');
res.json( {
meta:{
success: false,
message: 'Email "'+req.body.email+'" already exists.',
}
});
} else {
db.user.create({ /* ... */});
}
})
.catch(err =>{
console.log(err);
return; // <------ this is too
});
/* no code here */
});
谢谢
最佳答案
因为必须捕获所有不成功的(警告/错误)响应,所以有 .catch
。可以有选择地捕获错误。这是关于个人方法,所以我将如何解决这个问题:
// fake db call; set userReturned if user should be returned; userReturned=string
function dbUserCall(userReturned) {
return new Promise(resolve => setTimeout(resolve, 500, userReturned));
}
// custom error type
function UserExistErr(user) {
this.msg = 'User ' + user + ' already exists';
this.user = user;
}
// returns always promise
function createUser(user) {
if (user)
return Promise.reject(new UserExistErr(user));
console.log('Info: User does not exist. Creating new one..');
return dbUserCall('John');
}
function catchRespErr(err) {
switch (err.constructor) {
case UserExistErr:
console.log('Warning: ' + err.msg);
// set warning res
break;
default:
console.log('Error: ' + err);
// set default error res
}
}
dbUserCall('Jack')
.then(createUser)
.then(user => console.log('Info: User '+ user +' created!'))
.catch(catchRespErr);
关于javascript - 在 promise.then 中停止处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245121/