我使用expressgenerator获取了示例节点js代码,默认情况下获取错误处理代码如下
app.use(function (req, res, next) {
console.log("first callback 1");
var err = new Error('Not Found');
err.status = 404;
next(err);
console.log("first callback 2");
});
app.use(function (err, req, res, next) {
// set locals, only providing error in development
console.log("second callback");
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
console.log("error send");
});
我在这些错误处理回调中添加了几个console.logs。我从回调中了解到,由于我们没有提供任何路由,因此将为所有路由调用这两个回调。
现在在我的代码中,我添加了一条路由
app.get('/login', function(req, res, next) {
res.sendFile(__dirname + '/public/views/login.html');
});
现在,当我运行我的应用程序并转到我的app.js中不存在的localhost:3000/home
时,它正在打印
first callback 1
second callback
error send
first callback 2
first callback 1
second callback
error send
first callback 2
问题1:为什么控制台日志被打印两次?它不应该在firstcallback 2之后打印。
现在,当我转到localhost:3000/login
时,它会向我呈现login.html页面,因为路由存在,但我的服务器端没有控制台日志。
问题2:为什么第一个控制台"第一个回调1"因为回调适用于所有路线而且在这种情况下因为它至少没有错误它应该打印我的第一个控制台..但不是..为什么它没有做那个回调??
有人可以解释这个以及如何在此处调用回调并使用next()