Bluebird 在 Node.js 上的承诺:错误和异常处理
Bluebird promises on Node.js: error and exception handling
我将 bluebird promises 用于 node.js 应用程序(MEAN 环境)。不过,我无法理解 exception/error 处理。考虑以下代码:
var Promise = require('bluebird'),
library1 = Promise.promisifyAll(require('firstlibrary')),
library2 = Promise.promisifyAll(require('secondlibrary'));
//main
exports.urlchecker = function(req, res) {
library1.doSomething(req.body.url) //--> how to reject this promise?
.then(function(response) {
if (response == false) {
throw new LinkError("URL invalid!");
}
library2.Foo(req.body.url)
.then(function(response2) {
if (response2 == false) {
throw new SizeError("URL too long!");
}
res.json({
status: true
});
}).catch(LinkError, function(e) { //--> causes error!
res.json({
status: false
});
}).catch(SizeError, function(e) { //--> causes error!
res.json({
status: false
});
}).catch(function(e) { //--> catch all other exceptions!
res.json({
status: false
});
});
});
};
library1
- 承诺:
exports.doSomething = function(url, cb) {
if (whatever == 0) {
cb(null, false); //--> what to return to reject promise?
} else {
cb(null, true);
}
};
我现在有两个问题。
- 我必须从
library1
return 做什么才能拒绝它的承诺?如果不是通过 return 值,我该怎么做?
如何定义和捕获我自己的异常?上面的代码导致此错误:
Unhandled rejection ReferenceError: LinkError/SizeError is not defined
.promisify*()
将常规 Node.js 回调约定转换为承诺。该约定的一部分是将错误作为第一个参数传递给回调函数。
换句话说,要拒绝承诺,请使用 cb(new Error(...))
。
示例:
var Promise = require('bluebird');
var library1 = {
// If `doFail` is true, "return" an error.
doSomething : function(doFail, cb) {
if (doFail) {
return cb(new Error('I failed'));
} else {
return cb(null, 'hello world');
}
}
};
var doSomething = Promise.promisify(library1.doSomething);
// Call that resolves.
doSomething(false).then(function(result) {
console.log('result:', result);
}).catch(function(err) {
console.log('error:', err);
});
// Call that rejects.
doSomething(true).then(function(result) {
console.log('result:', result);
}).catch(function(err) {
console.log('error:', err);
});
至于缺失的错误类型:我假设它们是由 secondlibrary
导出的,所以使用 library2.LinkError
而不是 LinkError
。如果它们未导出,您将无法明确捕获它们。
我将 bluebird promises 用于 node.js 应用程序(MEAN 环境)。不过,我无法理解 exception/error 处理。考虑以下代码:
var Promise = require('bluebird'),
library1 = Promise.promisifyAll(require('firstlibrary')),
library2 = Promise.promisifyAll(require('secondlibrary'));
//main
exports.urlchecker = function(req, res) {
library1.doSomething(req.body.url) //--> how to reject this promise?
.then(function(response) {
if (response == false) {
throw new LinkError("URL invalid!");
}
library2.Foo(req.body.url)
.then(function(response2) {
if (response2 == false) {
throw new SizeError("URL too long!");
}
res.json({
status: true
});
}).catch(LinkError, function(e) { //--> causes error!
res.json({
status: false
});
}).catch(SizeError, function(e) { //--> causes error!
res.json({
status: false
});
}).catch(function(e) { //--> catch all other exceptions!
res.json({
status: false
});
});
});
};
library1
- 承诺:
exports.doSomething = function(url, cb) {
if (whatever == 0) {
cb(null, false); //--> what to return to reject promise?
} else {
cb(null, true);
}
};
我现在有两个问题。
- 我必须从
library1
return 做什么才能拒绝它的承诺?如果不是通过 return 值,我该怎么做? 如何定义和捕获我自己的异常?上面的代码导致此错误:
Unhandled rejection ReferenceError: LinkError/SizeError is not defined
.promisify*()
将常规 Node.js 回调约定转换为承诺。该约定的一部分是将错误作为第一个参数传递给回调函数。
换句话说,要拒绝承诺,请使用 cb(new Error(...))
。
示例:
var Promise = require('bluebird');
var library1 = {
// If `doFail` is true, "return" an error.
doSomething : function(doFail, cb) {
if (doFail) {
return cb(new Error('I failed'));
} else {
return cb(null, 'hello world');
}
}
};
var doSomething = Promise.promisify(library1.doSomething);
// Call that resolves.
doSomething(false).then(function(result) {
console.log('result:', result);
}).catch(function(err) {
console.log('error:', err);
});
// Call that rejects.
doSomething(true).then(function(result) {
console.log('result:', result);
}).catch(function(err) {
console.log('error:', err);
});
至于缺失的错误类型:我假设它们是由 secondlibrary
导出的,所以使用 library2.LinkError
而不是 LinkError
。如果它们未导出,您将无法明确捕获它们。