上周我一直在处理错误,特别是 Node.js 模块中的错误处理。首先,这是我的代码:
user.js 路由
router.post('/register', function(req, res) {
var newUser = new User({
firstname: req.body.firstname,
lastname: req.body.lastname,
email: req.body.email,
password: req.body.password,
});
User.addUser(newUser, function(err, user) {
if(err) {
return next(err)
} else if(user) {
res.status(403).send('User already exists');
} else {
res.sendStatus(200);
}
});
});
user.js 模块
module.exports.addUser = function(newUser, cb) {
User.findOne({ email: newUser.email }, function(err, user) {
if(err) {
cb(err);
} else if(user) {
cb(null, user);
} else {
bcrypt.genSalt(10, function(err, salt) {
if(err) {
cb(err);
} else {
bcrypt.hash(newUser.password, salt, function(err, hash) {
if(err) {
cb(err)
} else {
newUser.password = hash;
newUser.save(function(err, newUser) {
if(err) {
cb(err);
} else {
cb(null, false);
}
});
}
});
}
});
}
});
}
每当user.js模块内部出现错误时,调用回调函数并处理user.js路由内部的错误。这可行,但是我的模块内的困惑看起来不太好,因为有太多 if-else 语句..
是否有更好的方法,或者我必须每次都检查是否有错误?
最佳答案
您可以将代码简化为:
module.exports.addUser = function(newUser, cb) {
User.findOne({ email: newUser.email }, function(err, user) {
if(err) {
cb(err);
return;
}
if(user) {
cb(null, user);
return ;
}
bcrypt.genSalt(10, function(err, salt) {
if(err) {
cb(err);
return;
}
bcrypt.hash(newUser.password, salt, function(err, hash) {
if(err) {
cb(err)
return;
}
newUser.password = hash;
newUser.save(function(err, newUser) {
if(err) {
cb(err);
return;
}
cb(null, false);
});
});
});
});
}
但是,如果我是您,正如 @Scimonster 在他的评论中所述,这是 promises 的典型用例这将允许您编写更具可读性的代码并避免 callback hell
关于javascript - Node.js 模块错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439459/