【发布时间】:2015-03-22 07:09:39
【问题描述】:
我正在开发一个 Node.js/CoffeeScript 应用程序,我在其中使用类层次结构来处理错误。当我在路由处理程序的根目录中使用 throw 语句时,一切正常:
class APIError extends Error
constructor: ->
app.error (err, req, res, next) ->
if err instance of APIError
console.log 'APIError captured'
app.get '/', (req, res, next) ->
throw new APIError
但是,对于 Mongoose,在回调函数中使用 throw 语句:
app.get '/', (req, res, next) ->
UserModel.where('name', 'Joe').findOne (err, doc) ->
throw new APIError
结果
/usr/local/lib/node_modules/mongoose/lib/utils.js:413
throw err;
^
Error:
当我改为拨打next() 时,如
app.get '/', (req, res, next) ->
UserModel.where('name', 'Joe').findOne (err, doc) ->
return next new APIError
甚至在处理程序的主体中使用它:
app.get '/', (req, res, next) ->
next new APIError
我在控制台中打印出undefined。
将最后一条语句更改为return next Error 可以按预期工作,即控制台中正在打印异常堆栈跟踪:
app.get '/', (req, res, next) ->
return next Error 'This works as expected'
是 Node.js 问题还是我在 CoffeeScript 中定义类的方式?任何想法如何使这种错误层次结构起作用?
更新 1
我可以确认这是 CoffeeScript 类的实现方式。使用标准的JS原型链定义解决了问题,但感觉不对。
【问题讨论】:
-
是的,这绝对是 - 前几天我正在为类似的事情苦苦挣扎,没有正确抛出带有新自定义错误的扩展错误,或者实际上不是正确的类型,具体取决于在构造函数上 - 它的工作方式不太正确。
标签: node.js coffeescript mongoose