在一个地方进行猫鼬错误处理

zis*_*she 3 error-handling mongoose node.js coffeescript

我在mongoose docs中发现我可以处理我想要的错误.所以你可以这样做:

Product.on('error', handleError);
Run Code Online (Sandbox Code Playgroud)

但这种handleError方法的签名是什么?我想要这样的东西:

handleError = (err) ->
  if err
    console.log err
    throw err
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

Mic*_*ley 5

Node中的标准是error事件提供一个参数,这就是错误本身.根据我的经验,即使提供附加参数的少数库总是将错误留作第一个,因此您可以使用带签名的函数function(err).

您还可以在GitHub上查看源代码; 这是发出error事件的预保存挂钩,当错误出现时,错误作为参数:https://github.com/LearnBoost/mongoose/blob/cd8e0ab/lib/document.js#L1140

在JavaScript中还有一种非常简单的方法可以查看传递给函数的所有参数:

f = ->
  console.log(arguments)

f()                     # {}
f(1, "two", {num: 3})   # { '0': 1, '1': 'two', '2': { num: 3 } }
f([1, "two", {num: 3}]) # { '0': [ 1, 'two', { num: 3 } ] }
Run Code Online (Sandbox Code Playgroud)

所以现在到你的功能不起作用的部分; 你的代码究竟是如何读取的?这个名字handleError在任何方面都不特别; 你需要这两个中的一个:

选项1:定义函数,并将引用传递给事件注册:

handleError = (err) ->
  console.log "Got an error", err

Product.on('error', handleError)
Run Code Online (Sandbox Code Playgroud)

选项2:定义内联函数:

Product.on 'error', (err) ->
  console.log "Got an error", err
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,如果你定义一个回调函数,那么处理程序将不会运行,所以如果你是`Product.save(function(err,doc){})`,那么你应该自己处理错误. (9认同)