1

The Nodejs API states...

By the very nature of how throw works in JavaScript, there is almost never any way to safely "pick up where you left off", without leaking references, or creating some other sort of undefined brittle state.

However Koa traps errors and avoids exiting the nodejs process. What enables Koa to safely flout this advice?

4

1 回答 1

1

主要有两种情况 koa 不能安全地处理错误。

在不同的刻度上抛出错误:

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

未设置为的发射器错误response.body=

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

执行第一种情况的任何函数或库都是格式错误的,不应使用。如果函数/库正确使用了 Promise 和/或回调,它就永远不会发生。

对于发射器,只需始终将每个流设置为主体(或使用中间件):

 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 回答