我有一个表单,当提交后某些内容没有正确时,我希望能够向用户提供特定的错误消息.我使用Sequelize作为我的ORM,并且返回的承诺对所有嵌套代码都有点混乱.
例如,如果我们要更新两个模型:用户和照片:
models.User.find({where: {name: 'bob' }}).then(function(user) { if(user) { user.updateAttributes({email: email}).then(function(user) { models.Photo.find({where: { hash: hash}}).then(function(photo) { if(photo) res.json({"message":"updated"}); else res.status(404).json({"error": "Could not find Photo"}); }).catch(err) { res.status(500).json({"error": err}); }); }).catch(function(err) { res.status(500).json({"error": err}); }); } else { res.status(404).json({"error": "Could not find user"}); } }).catch(function(err) { res.status(500).json({"error": err}); });
如果我在表单中有10个字段要更新,那么所有嵌套代码都会变得霸道.
如果我希望有特定的错误描述,还有更易读的代码,可以给出什么建议?是否有可能在一个代码块中捕获所有404和500错误而不是像我一样分解它们?
解决方法
您可以使用promise链接和帮助方法将代码减少到一系列3 .thens和单个.catch:
function notFoundError(model) { var e = new Error('Could not find ' + model); e.statusCode = 404; throw e; } models.User .find({where: {name: 'bob'}}) .then(function (user) { if (user) { return user.updateAttributes({email: email}); } else { notFoundError('user'); } }) .then(function (user) { return models.photos.find({where: {hash: hash}}); }) .then(function (photo) { if (photo) res.json({"message": "updated"}); else notFoundError('photo'); }) .catch(function (err) { if (err.statusCode) { res.status(err.statusCode); } else { res.status(500); } res.json({'error': err.message}); });