我用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行是方法调用发生的地方。
答案 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)
Express严重依赖节点异步性质。如果我保持这一点,看到第30行抛出的错误会让我感到毛骨悚然。尝试重构您的代码,只使用next(err)
模式。
你的应用程序挂起的原因是Express还没有完成 HTTP响应(例如:res.send()
)。这意味着您已经破坏了管道,其中错误已经冒出调用堆栈但没有重定向到Express中间件管道。尝试注册一些error middleware以查看是否因错误而调用它。