所以,我开始了我的nodejs之旅。我有其他语言的经验,但承诺概念对我来说很新鲜。
我的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({ /* ... */});
});
基本上我想要的是当用户已经存在时停止处理。我(想)知道我可以在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 */
});
感谢
答案 0 :(得分:1)
由于必须捕获所有不成功(警告/错误)响应,因此存在.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);