javascript - Restify & Bluebird - 如何将错误从 catch block 传递到 restify 错误处理程序?

标签 javascript promise bluebird restify

我在一个节点 js 服务器上工作,并使用 bluebird 来实现 promise 。我了解如何使用 promise ,但我的问题是如何处理 promise 返回的错误。我尝试了简单的解决方案 - 只是再次抛出错误 - 但 Bluebird 捕获了它,并且客户端从未收到响应。下面是一个演示代码,以说明我的问题:

var restify = require('restify');
var Promise = require('bluebird');

var server = restify.createServer({
  name: 'myapp',
  version: '1.0.0'
});

server.get('/', function (req, res, next) {
    new Promise(function(resolve, reject){
        reject(new Error());
    }).then(function(res){
        res.send('hello');
    }).catch(function(e){
        throw e;
    });
});

server.on('uncaughtException', function (req, res, route, error) {
    console.log('error');
});

server.listen(7070, function () {
  console.log('%s listening at %s', server.name, server.url);
});

我正在寻找一种方法来以某种方式将错误传递给 restify,因此它会引发 uncaughtException 事件,我可以像处理任何其他未捕获的异常一样处理它。稍作搜索后,我发现我可以简单地执行类似 next(new InternalServerError()) 的操作,然后 restify 将为这个特定错误引发一个事件,但这对我来说有点奇怪,所以我正在寻找更好的方法。

最佳答案

这是一个 PoC,它将重新抛出任何“可能未处理的拒绝”。这些将随后触发 Restify 的 uncaughtException 事件:

var Promise = require('bluebird');
var restify = require('restify');
var server  = restify.createServer();

server.listen(3000);

Promise.onPossiblyUnhandledRejection(function(err) {
  throw err;
});

server.get('/', function (req, res, next) {
  Promise.reject(new Error('xxx')); // no `.catch()` needed
});

server.on('uncaughtException', function (req, res, route, err) {
  console.log('uncaught error', err);
  return res.send(500, 'foo');
});

关于javascript - Restify & Bluebird - 如何将错误从 catch block 传递到 restify 错误处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175643/

相关文章:

javascript - 如何将现有回调 API 转换为 Promise?

javascript - 数据属性中的 ES6 连接

javascript - DOJO实例化和使用源码的区别

javascript - 如何正确对待 promise ?

node.js - 如何改善我对此 promise 链的错误处理?

node.js - 如何使用 Bluebird promise AWS SQS

node.js - Bluebird Promise 和 Sequelize 模拟事务原子性

JavaScript 面向对象 : Uncaught TypeError: is not a function

javascript - javascript命名函数的范围是什么,作为参数传递

node.js - 未处理的拒绝事件与bugsnag发生冲突