2015-10-04 70 views
1

有下面的代码:catch异常/ promisses

router.put('/:id', function(req, res, next) { 
    models.Task.find(req.params.id).then(function(task) { 
    return task.updateAttributes({ 
     title: req.body.title, 
     description: req.body.description 
    }); 
    }).then(function(task) { 
    res.json(task); 
    }).catch(function(err) { 
    var err = new Error('Cannot find Task'); 
    err.status = 404; 
    next(err); 
    }); 
}); 

正如你所看到的,我用这条路线由id来更新任务模式。所以,现在我赶上错误,如果没有任何与id的任务,我尝试更新null对象的属性(ReferenceError错误类型)。所以,我刚刚向任务模型添加了验证,并且有机会使用空标题/描述(SequelizeValidationError错误类型)更新任务。我如何在我的catch块中处理这些错误?我想设置'无法找到任务','无法更新任务'消息这个错误。我应该分裂我的catch块还是其他什么?提前致谢!

+1

身份证建议使用蓝鸟承诺,而不是看到这个答案为什么http://programmers.stackexchange.com/questions/278778/why-are-native-es6-promises-slower-and-more-memory-intensive-than -bluebird – baao

回答

1

如果你不愿意使用加速和增强了像蓝鸟本土承诺的API库,你可以建立一些功能自己:

function errT(type, fn){ 
    return function(err){ // create a handler for errors 
     if(!(err instanceof type)) throw err; // allow fallthrough if it doesn't match 
     return fn(err); 
    }; 
} 

或类似的在ES2015语法:

let errT = (type, fn) => err => (err instanceof type) ? Promise.reject(err) : fn(err); 

这将让你这样做,例如:

promiseReturningFn(). 
    catch(errT(TypeError, handleTypeError)). 
    catch(errT(ReferenceError, handleReferenceError)); 

我我们热烈地建议你将错误的子类别提供给你自己的类型,提供额外的信息并抓住这些信息。我在自己的代码中发现它是非常积极的做法,它有助于避免意外地捕捉程序员错误(而不是应用程序错误)。

+0

你能否给我提供使用蓝鸟的例子?对我的任务 – malcoauri

+0

@malcoauri基本上,蓝鸟这个开箱即用,所以你可以在catch周围删除'errT',而不必定义它(它也会更快),所以只需''''''''''''' (TypeError,handleTypeError).catch(ReferenceError,handleReferenceError)'也有内置的'.error'和一个用于应用程序错误的'OperationalError'类型,所以你不会意外地沉默程序员错误。 –