1

Nodejs APIの状態...

JavaScript で throw がどのように機能するかという性質上、参照を漏らしたり、他の種類の未定義の脆弱な状態を作成したりせずに、安全に「中断したところから再開する」方法はほとんどありません。

ただし、Koa はエラーをトラップし、nodejs プロセスの終了を回避します。Koa がこのアドバイスを安全に無視できる理由は何ですか?

4

1 に答える 1

1

koa がエラーを安全に処理できない主なケースは 2 つあります。

異なるティックでスローされるエラー:

app.use(function* () {
  setImmediate(function () {
    throw new Error('boom')
  })
})

として設定されていないエミッタ エラーresponse.body=:

app.use(function* () {
  this.response.body = stream.pipe(zlib.createGzip())
})

最初のケースを実行する関数またはライブラリは形式が正しくないため、使用しないでください。関数/ライブラリがプロミスやコールバックを正しく使用している場合、それは決して起こりません。

エミッターの場合は、常に各ストリームを本体として設定する (またはミドルウェアを使用する) だけです。

 app.use(function* () {
  this.response.body = stream
  this.response.body = this.response.body.pipe(zlib.createGzip())
})

Koa は、「非同期」のもの、特にコールバックとプロミスで try/catch を使用できるようにすることでこれを行います。ただし、別のティックまたはエミッターでスローされたエラーを試行/キャッチすることはできません。

于 2014-12-26T22:03:20.073 に答える