【发布时间】:2015-10-31 01:03:44
【问题描述】:
我对如何从水线管理错误验证感到很困惑,我需要对良好做法进行一些说明。 通常我有这样的承诺链:
sails.models.user.findOne(...)
.then(function(){
//...
//...
return sails.models.user.update(...);
})
.then(....)
.then(....)
.catch(function(err){
})
出现的一个问题是当水线返回验证错误时。在这种情况下,我通常需要知道问题是由客户端输入错误或代码中的错误产生的。
我最终要做的是将水线承诺包装在正确处理验证错误的承诺中。所以最终的代码是:
...
.then(function(){
//...
//...
return new Promise(function(resolve,reject){
sails.models.user.update(...)
.then(resolve)
.catch(function(err){
//the error is a bug, return the error object inside the waterline WLError
reject(err._e);
//the error is caused by wrong input, return the waterline WLError
reject(err);
})
})
})
.then(function(){
//second example: we are sure that a validation error can't be caused by a wrong input
return wrapPromise(sails.models.user.find());
})
.then(....)
.catch(function(err){
//WLError ---> res.send(400);
//Error object --> res.send(500);
})
function wrapPromise(action){
//return an error object on validation error
return new Promise(function(resolve,reject){
action
.then(resolve)
.catch(function(err){
reject(err._e || err);
})
})
}
我做事正确吗?有没有更好的方法来正确处理错误? 谢谢
【问题讨论】:
-
避免使用
Promiseconstructor antipattern!只是在catch回调中的throw而不是调用reject() -
@Bergi 我认为需要reject(err._e || err) 来检查err._e 是否存在。第一个reject(err._e)可以换成throw err._e,但是应该一样
-
不,可能需要
||,但不需要reject()调用。你应该只是在做return ….catch(function(err) { throw err._e || err; }); -
如果您遇到错误,也可以访问 Sails.js Gitter 页面。我在那里找到了一些帮助,而且我对编码很陌生。 Gitter
标签: node.js validation promise sails.js waterline