gpt4 book ai didi

node.js - 自定义错误未在 throw 语句或 next() 调用上正确传播

转载 作者:搜寻专家 更新时间:2023-10-31 23:49:33 30 4
gpt4 key购买 nike

我正在开发一个 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 原型(prototype)链定义可以解决问题,但感觉不对。

最佳答案

在其构造函数中设置类的 name 属性解决了问题(第 3 行):

class APIError extends Error
constructor: ->
@name = 'APIError'

app.use (err, req, res, next) ->
if err instance of APIError
console.log 'Error captured'

app.get '/', (req, res, next) ->
#This will work: captured by error handler
throw new APIError

app.get '/in-mongoose-callback', (req, res, next) ->
UserModel.where('name', 'Joe').findOne (err, doc) ->
#This one works as expected: captured by error handler
return next new APIError

这是由于 one of the changes登陆 CoffeeScript 1.3.3(2012 年 5 月 15 日):

Due to the new semantics of JavaScript's strict mode, CoffeeScript no longer guarantees that constructor functions have names in all runtimes. See #2052 for discussion.

请注意,在 Mongoose 查询回调中使用 throw 语句而不是 next() 将不起作用

关于node.js - 自定义错误未在 throw 语句或 next() 调用上正确传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11652932/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com