下面是我的代码,它有两个回调和一个get路由
app.get('/login', function(req, res, next) {
res.sendFile(__dirname + '/public/views/login.html');
});
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");
});
基本上,这里的两个回调是针对错误的,我运行应用程序并转到localhost:3000/home
,因为没有路由,并且由于回调,我将得到404Error。
但是如果我转到localhost:3000/login
,它会显示我的login.html页面,但没有回调得到called.Even,尽管没有错误,我的意思是至少它应该在callback.But中打印第一个控制台消息,为什么它没有调用回调?
我读到的关于回调的内容是,如果你没有指定任何路径,它会被所有的routes.But调用,为什么不在这里呢?如果我错了,有人能花点时间读一下并清除我的错误吗?
发布于 2017-03-29 09:54:59
这与回调无关。它是关于Express中的中间件(插件/模块)架构是如何工作的(顺便说一句,还有许多其他框架,但请注意:并不是所有的框架都是这样工作的)。
Express实现的真正代码是模块化的,有点复杂,但基本上它的工作原理是这样的:
var middlewares = [];
var app = {
use: function (callback) {
middlewares.push({path:"", callback: callback});
},
get: function (path, callback) {
middlewares.push({path: path, callback: callback});
}
}
所以你看,这个想法很简单。真的没什么花哨的。.use()
用于添加要在所有路径下执行的代码,.get()
用于添加要在路径匹配时执行的代码。
因此,我们现在可以通过循环遍历数组来处理发送到服务器的每个请求:
// WARNING: NOT REAL CODE, this is only meant as an illustration
function processRequest (req, res) {
for (var i=0; i<middlewares.length; i++) {
var whatToDo = middlewares[i];
if (whatToDo.path == "") { // no need to check path
whatToDo.callback(err, req, res, next);
}
else if (whatToDo.path == req.path) { // check if path match
whatToDo.callback(req, res, next);
}
}
}
这就是它的工作原理。当然,中间件是异步的,所以在实际代码中我们不能使用for循环。这就是next()
函数的实际用途--像链表一样循环遍历中间件(只有它的链接函数)。如果没有调用next()
,则循环停止。
https://stackoverflow.com/questions/43087854
复制相似问题