我很擅长承诺并且现在和他们一起玩。我创建了这个基本的应用程序:
var Promise = require("bluebird");
var express = require('express');
var bcrypt = require('bcrypt-nodejs');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
getStuffFromDb('my_password')
.then((hash) => {
console.log('hash = ' + hash);
return hash;
})
.then((hash) => {
res.send(hash);
})
.catch(function(error) {
errorHandler(error, res)
});
});
function getStuffFromDb(password) {
return new Promise(function(resolve, reject) {
//This should fail because it is missing a parameter, a number to specify how many loops
bcrypt.genSalt(function(error, result) {
if (error) {
return reject(Error("It broke 1"));
}
//This should cause an error as result_which_does_not_exist is not defined, and the call to the function should be bcrypt.hash(password, result_which_does_not_exist ...) so it is missing a parameter
bcrypt.hash(result_which_does_not_exist, null, function(err, hash) {
if (err) {
return reject(Error("It broke 2"));
} else {
return resolve(hash);
}
});
});
});
}
function errorHandler(error, res) {
res.send(error.message);
}
app.listen(3000, function() {
console.log('Example app listening on port 3000!');
});
所以独立的这个函数应用程序应该在生成salt时失败,因为缺少参数。相反,它在密码散列时失败,因为缺少参数并且我传入了一个不存在的变量。这导致我的服务器崩溃,出现以下错误:
bcrypt.hash(result_which_does_not_exist, null, function(err, hash) { ReferenceError: result_which_does_not_exist is not defined.
所以应用程序崩溃了,但是我想要处理这个错误,我不希望它崩溃我的服务器。我怎样才能做到这一点?我对承诺很新(大约1小时阅读它们),但根据我的理解,捕获应该抓住了这个?
答案 0 :(得分:0)
首先documentation of bcrypt-nodejs表示bcrypt.genSalt
的第一个参数是可选的。所以这就是为什么它不会导致盐的产生失败。
其次,Promise捕获应该正常工作。当我尝试没有蓝鸟时,它可以工作。当node.js内置了Promise时,你为什么要使用bluebird?
答案 1 :(得分:0)
bcrypt.hash
没有捕获错误并将其传递给回调,而是运行时抛出引用错误,因为result_which_does_not_exist
是一个不存在的变量。
为变量赋值以避免引用错误!或者在try / catch中抛出代码。
例如,这将引发一个引用错误:
var Promise = require("bluebird");
new Promise(function(resolve, reject) {
console.log(foo);
});
...
未处理拒绝ReferenceError:未定义foo
这是你需要做的:
new Promise(function(resolve, reject) {
try {
console.log(foo);
} catch (err) {
reject(err);
}
});
但这一切都没有意义 - 你应该修正引用错误:)