一些内部细节。
express app handle
函数的主要目的是向客户端发送响应,并终止
请求-响应周期
。而这个周期的终止可以通过其中一个
响应方法
(如 res.end()、res.json() 等)来完成。也就是说,如果中间件或
路由处理程序
执行了某些操作,但没有调用其中一个
响应方法
或将控制权传递给下一个处理程序或中间件,则
请求-响应周期
将不会被终止。但
next
的作用取决于它在何处以及如何调用。
为了管理不同的任务(路由处理程序、中间件),
express
创建了
堆栈
。它们看起来像是一系列
任务
的
队列
。每个
路由器
和
路由
都会创建自己的
任务堆栈
。
express app
的
use
方法将
任务
(
中间件
函数)推送到
路由器
的
堆栈
中。
app.get
、
app.post
等会在
路由器
中创建一个单独的
路由
(带有自己的
堆栈
),并将该
路由
的实际
处理程序
推送到其中,然后将这些
路由
处理程序包装在一个函数中推送到
路由器
中。也就是说,当在
路由器
中创建一个
路由
时,会将类似于
route
task
(包装函数)与推送的
子任务
放入其中。
app.use((req, res, next) => {
console.log('log request');
next();
});
app.get('/', (req, res, next) => {
res.send('Hello World');
});
作为一个路由,它有自己的堆栈。如果没有参数调用next方法,我们只能到达路由的下一个处理程序:
app.get('/',
(req, res, next) => {
console.log('first handler');
next();
},
(req, res, next) => {
console.log('second handler');
res.send('Hello World');
}
);
在middleware
中调用next
(express
建议使用use
方法来挂载middleware
)会将我们带到router
的下一个route
或middleware
,因为已经挂载的middleware
会被推入到router
的stack
中。
next
接受不同的参数。任何不是'route'
或'router'
的参数都会被视为错误,并传递给error
middleware
,该middleware
必须在所有路由之后挂载,并具有四个参数:
app.use((error, req, res, next) => {
res.status(error.status || 500);
res.send(error.message || 'Server internal error');
});
使用'route'
作为next
的参数将跳过所有剩余的route
handlers
并让我们进入router
的下一个route
:
app.get('/',
(req, res, next) => {
console.log('first handler');
next('route');
},
(req, res, next) => {
next();
}
);
app.get('/',
(req, res, next) => {
res.send('Hello World');
}
);
在next
函数中使用字符串参数'router'
可以使我们退出当前的router
:
app.get('/',
(req, res, next) => {
console.log('first handler');
next('router');
},
(req, res, next) => {
next();
}
);
app.get('/',
(req, res, next) => {
res.send('Hello World');
}
);
res.send
来完成请求。如果不存在,则很可能有另一个处理程序会发出错误并完成请求。 - Dominic Barnesapp.get('/users',function(req,res))
后面有一个app.post('/login',function(req,res))
,通过调用 next() 它将调用 login 作为 app.js 文件中的下一个路由? - Menztrualapp.get("/users")
注册了另一个路由,则如果上面的处理程序调用 next,则将运行该路由。 - Dominic Barnes