捕获node.js中的exception表示代理应用程序

我有一些如下所示的代理代码。 问题是,无论何时目标服务器closures,此代码都无法捕获错误,从而导致整个应用程序崩溃,并显示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 }); } }); 

谢谢!

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

相反,您必须了解每个特定的asynchronous操作如何报告错误,并确保将其插入到特定的机制中。

例如,stream将消息发送到您用stream.on('error', ...)截取的stream中。 例如, request()可以根据您实际使用的request()库以及如何使用它来以多种不同的方式报告错误。

一些参考:

用node.jsstream处理错误

stream可读错误

错误事件如何影响Node.js中的pipe道stream