为什么此错误导致应用程序崩溃而不是被捕获和处理

时间:2016-06-09 17:26:37

标签: node.js error-handling promise bluebird

我很擅长承诺并且现在和他们一起玩。我创建了这个基本的应用程序:

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小时阅读它们),但根据我的理解,捕获应该抓住了这个?

2 个答案:

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

但这一切都没有意义 - 你应该修正引用错误:)