【问题标题】:How to listen for error happening inside `request.on('end',`如何监听 `request.on('end',` 中发生的错误
【发布时间】:2016-10-25 10:34:46
【问题描述】:

我有这段代码会从 concat 方法中引发错误:

request.on('end', function (chunk) {
    body = Buffer.concat(body).toString();
});

我想收到有关错误的通知,所以我添加了一个监听器:

request.on('error', function (error) {
    var e = error;
})

但它没有被触发。为什么?如何在不使用try/catch 的情况下使用error 事件收听它?

这不是关于我为什么会收到错误的问题,而是如何使用error event 捕获它的问题

【问题讨论】:

  • 或者在request() 周围使用promise 包装器,这样在.then() 处理程序中处理响应时出现的任何错误都会自动为您捕获并变成被拒绝的promise。使用 Promise 的另一个好处(自动 try/catch 包装)。
  • @jfriend00,知道了,谢谢建议

标签: javascript node.js


【解决方案1】:

它不会触发,因为触发 error 的事件在 request 对象内部,而您的问题在另一个范围内。

您可以在调用Buffer.concat 时使用try/catch 代替

request.on('end', function (chunk) {
    try {
      body = Buffer.concat(body).toString();
    } catch (e) {
      // do something with "e"
    }
});

【讨论】:

  • @Maximus 另外,不应该是Buffer.concat(chunk) 而不是body吗?
  • 谢谢,但我对如何在使用error 事件处理流错误的过程中收听错误很感兴趣。有可能吗?
  • Buffer.concat 不是流错误,这是您的应用程序域特定错误
  • 所以你的意思是,例如,fs 流在尝试读取文件时将操作包装在 try/catch 中,如果它因异常失败而在流上发出 error 事件?
  • 我说的正好相反,无论你在.on('end') 块上的函数发生什么,都不会影响流错误处理
【解决方案2】:

我认为最终,它会归结为这样的:

request.on('end', function() {
  try {
    body = Buffer.concat(body).toString();
  } catch(e) {
    request.emit('error', e);
  }
});

当然,您可以为此创建一个包装器:

function wrap(fn) {
  return function() {
    try {
      return fn.apply(this, arguments);
    } catch(e) {
      this.emit('error', e);
    }
  }
}

request.on('end', wrap(function() {
  body = Buffer.concat(body).toString();
}));

【讨论】:

    【解决方案3】:

    我至少知道这适用于 request 包 - 当然值得测试它是否也适用于本机节点包。告诉我!

    request
    .on('end', function (chunk) {
        try {
            body = Buffer.concat(body).toString();
        }
        catch(e) {
            this.emit('error', e);
        }    
    })
    .on('error', function (chunk) {
        console.log('failed on chunk: %s', chunk);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2021-04-20
      • 2013-01-16
      相关资源
      最近更新 更多