Restify & Bluebird - 如何将错误从 catch 块传递到 restify 错误处理程序?
Restify & Bluebird - how to pass an error from a catch block to restify error handler?
我正在使用 node js 服务器,并使用 bluebird 来实现 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);
});
我正在寻找一种方法来以某种方式将错误传递给 restify,因此它会引发 uncaughtException
事件,我可以像处理任何其他未捕获的异常一样处理它。稍作搜索后,我发现我可以简单地执行 next(new InternalServerError())
之类的操作,然后 restify 会针对这个特定错误引发一个事件,但这对我来说看起来有点奇怪,所以我正在寻找更好的方法。
这是一个将重新抛出任何 "possibly unhandled rejections" 的 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');
});
我正在使用 node js 服务器,并使用 bluebird 来实现 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);
});
我正在寻找一种方法来以某种方式将错误传递给 restify,因此它会引发 uncaughtException
事件,我可以像处理任何其他未捕获的异常一样处理它。稍作搜索后,我发现我可以简单地执行 next(new InternalServerError())
之类的操作,然后 restify 会针对这个特定错误引发一个事件,但这对我来说看起来有点奇怪,所以我正在寻找更好的方法。
这是一个将重新抛出任何 "possibly unhandled rejections" 的 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');
});