使用express,node.js中的未定义变量不会抛出任何错误

时间:2014-01-18 15:29:12

标签: node.js express

我用express运行node.js。我写了一个包含方法的节点模块,所以当你去的时候 http://bla.com/module_name/method_name 它将运行该方法。

该方法遵循

的典型风格
exports.method_name(req, res, next);

我的主应用程序执行以下操作:

app.all("*", resSetup, controller, render);

和控制器是基于路径调用方法的东西。

似乎如果方法中存在未定义的变量错误,express将挂起并且不会抛出任何错误。控制台日志中也不会出现任何内容。我可以在错误发生之前和之后放置控制台消息,之前将出现在日志中,之后则不会。

我可以将它包装在try / catch中并获取:

[ReferenceError: blabla is not defined]

但没有行号或任何内容。

我的猜测是快递以某种方式防止错误出现。当我将错误放在直接在路径中的名为“controller”的函数中时,它会正确显示错误。

这可能并不重要,但这是我正在处理的代码:

https://github.com/RobKohr/quick-site/blob/master/index.js

第189行是方法调用发生的地方。

2 个答案:

答案 0 :(得分:2)

基于Ruairi上面的评论,我在使用'q'(https://github.com/kriskowal/q)时遇到了同样的问题,并且使用express - promises会挂起并且没有生成错误。

通过在promise'回调'链的末尾添加一个catch,我能够看到错误并将其打印到控制台等。

代码最终看起来像:

export function index(req, res) {

    //Create the 'promise'
    var request = req.body;
    var queryJobID = req.query.jobId;
    console.log('queryJobID: ' + queryJobID);
    var jobStatusPromsie = jobManager.job.getStatus(queryJobID);

    Q.all([jobStatusPromsie])
    .then(
        function (result) {
            var responseData = {};
            console.log('Job Status Response received');
            if (result != null) {
                //Without the .catch below an error here will be 'silent'
                console.log('jobStatus result: ' + util.inspect(result, false, null));
                responseData['status'] = 'OK';
                responseData['progress'] = result.progress;
                res.json(responseData);
            } else {
                console.log('jobStatus Error');
                responseData['status'] = 'Error';
            }
            res.json(responseData);
            console.log('jobStatus Response data sent');
        },
        function (error) {
            console.log('Error while getting job status:', error);
            res.json("Error");
        })
    .catch(function(err) {
        //handle errors
        console.log('Promise error while getting job status:', err);
    }); 
}

答案 1 :(得分:0)

  1. Express严重依赖节点异步性质。如果我保持这一点,看到第30行抛出的错误会让我感到毛骨悚然。尝试重构您的代码,只使用next(err)模式。

  2. 你的应用程序挂起的原因是Express还没有完成 HTTP响应(例如:res.send())。这意味着您已经破坏了管道,其中错误已经冒出调用堆栈但没有重定向到Express中间件管道。尝试注册一些error middleware以查看是否因错误而调用它。