LoginSignup
3
3

More than 5 years have passed since last update.

node.js + CoffeeScriptでコールバックにエラーを渡す正しい方法

Posted at

node.jsでコードを書いていると例外が出た時にコールバックにエラーを渡して呼び出し元に処理を任せるということがよくあります。

# 呼び出した関数
  @error1:(val,cb)->
    console.log 'start'
    if val
      cb new Error('error Test')
    cb null,'ok'
    console.log 'end'

# 呼び出し元
ReturnTest.error1 1, (err,result)->
  if err
    console.log 'Error'
  else
    console.log result

しかしこの書き方では以下の結果になります。

start
Error
ok
end

コールバックを返した後もerror1メソッドの処理は続いてしまうので、console.log 'end'まで処理されてしまいます。

ポイントは

  • Errorオブジェクトをthrowすれば処理は止まる
  • コールバックにErrorオブジェクトを渡しても処理は止まらない

ということです。

new Error()してもthrowしているわけじゃないので止まりません。

正解はこちらです。

  @error2:(val,cb)->
    console.log 'start'
    if val
      return cb new Error('error Test')
    cb null,'ok'
    console.log 'end'

もしくは

  @error2:(val,cb)->
    console.log 'start'
    if val
      cb new Error('error Test')
      return 
    cb null,'ok'
    console.log 'end'

明示的にreturnして関数内の処理を終えなければいけません。

ちなみに一行ifはこんな感じ。

  @error3:(val,cb)->
    console.log 'start'
    return cb new Error('error Test') if val
    cb null,'ok'
    console.log 'end'

コールバック関数をラップしてコールバック関数を作る場合も多いと思いますので、スニペットを作っておくと便利です。

以下はatomの場合です。
atomメニュー -> Open Your Snippetsから編集できます。

'.source.coffee':
  'throw err if err':
    'prefix': 'errt'
    'body': 'throw err if err'
  'cb err if err':
    'prefix': 'errc'
    'body': 'return cb err if err'
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3