三、中间件
上面我们执行
app.get('/', function(){})时,里面的回调函数就是中间件。中间件其实就是一个函数,在使用
app.get,
app.post,
app.use等方法时,都是在调用中间件作为回调函数。 中间件都可以调用req和res对象,如果多个中间件顺序向下执行的话,上一个中间还需要一个next变量,来调用下一个中间件。这里
app.use的使用方法与
app.get一样,都是有两个参数:path和回调函数,而在这里,path参数是可以忽略不写的(忽略不写则每个请求都会执行该中间件)。
// 任何的请求,该中间件都会响应
app.use(function(req, res, next){
console.log('index m url: '+req.url);
next(); // 若没有next(),则请求就会被挂起,一直等待
})// /topic 下的请求都会响应,包括 /topic/1.html, /topic/c/1.html等
app.use('/topic', function(req, res, next){
console.log('topic m url: '+req.url);
next();
})
// 处理/根目录下的请求
app.get('/', function(req, res, next){
res.send('index');
});
// 处理 /topic/1.html 这种类型的请求
app.get('/topic/:id.html', function(req, res, next){
res.send('topic');
});
我们在浏览器中输入一些不同的url看看:
| url | 控制台输出 | 浏览器输出 | 说明 |
|---|---|---|---|
| 127.0.0.1:3000 | index m url: / | index | |
| /user | index m url: /user | Cannot GET /user | 中间件响应了不存在页面的请求 |
| /topic/1.html | index m url: /topic/1.html topic m url: /1.html | topic | 两个use中间件都响应了请求 |
| /topic/c/1.html | index m url: /topic/c/1.html topic m url: /c/1.html | Cannot GET /topic/c/1.html | 两个use中间件都响应了请求,只是没有路由来对该url进行处理 |
同时,
app.use()和
app.get()等方法,可以调用多个中间件依次执行,使用
next()将控制权交由下一个中间件。多个中间件既可以依次作为传输传递进去,也可以都放到数组中,也可以两者混用(









