Restify& Bluebird - 如何从catch块传递错误来解决错误处理程序?

时间:2015-08-24 06:22:33

标签: javascript promise bluebird restify

我正在使用节点js服务器,并使用bluebird实现promise。我理解如何使用promises,但我的问题是如何处理promise中返回的错误。我尝试了一个简单的解决方案 - 只是再次尝试错误 - 但蓝鸟抓住它,客户端永远不会收到响应。贝娄是一个演示代码,用于说明我的问题:

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);
});

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

1 个答案:

答案 0 :(得分:4)

这是一个将重新抛出任何可能未处理的拒绝的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');
});