如何听取`request.on里面发生的错误(' end',`

时间:2016-10-25 10:34:46

标签: javascript node.js

我有这个代码从concat方法抛出错误:

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

我希望收到有关错误的通知,因此我添加了一个列表器:

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

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

这不是关于我为什么会收到错误的问题,这是如何使用error事件来抓住它的问题

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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();
}));

答案 2 :(得分:1)

我至少知道这适用于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);
})