在node.js中捕获异常表示代理应用程序

时间:2016-07-16 00:59:31

标签: node.js express

我有一些代理代码,如下所示。问题是,无论何时目标服务器关闭,此代码都无法捕获错误,导致整个应用程序崩溃Error: connect ECONNREFUSED

对于代理服务器,这很糟糕,它只需要向调用者返回一个错误,而不是在第一次无法访问目标服务器时完全崩溃。

这些天来,正确的方法是什么?

节点版本6.

    let targetUrl = "http://foo.com/bar"

    app.options('/cors-proxy/bar', cors())
    app.post('/cors-proxy/bar', function(req, res) {  
      console.log(`received message with method ${req.method} and some body ${req.body}`)
      console.log(`relaying message to ${targetUrl}`)
      try {
        req.pipe(
          request({
            url: targetUrl,
            method: req.method,
            json: req.body 
          })
        ).pipe(res);
      } catch (err) {
        res.status(502)
        res.render('error', {
          message: err.message,
          error: err
        });
      } 
    });

谢谢!

1 个答案:

答案 0 :(得分:1)

通常,您不能使用try / catch来捕获异步回调或异步操作中可能发生的异常。这只会捕获同步错误。

相反,您必须阅读每个特定异步操作如何报告错误并确保您插入该特定机制。

例如,流报告错误,并向您使用stream.on('error', ...)拦截的流发送消息。例如,request()可以通过几种不同的方式报告错误,具体取决于您实际使用的request()库以及如何使用它。

一些参考文献:

Error handling with node.js streams

Stream Readable Error

How Error Events Affect Piped Streams in Node.js