next方法
next的作用是什么?
- next函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么请求将被挂起,后边定义的中间件将得不到被执行的机会。
如何使用
-
在express的use中使用next()可以放行中间件,执行下一条匹配的路由,需要注意的是,响应只能响应一次 后面的所有响应都没有效果了,如果在第一次匹配的路由做了响应,那么后面路由中的响应不会生效,但是其它代码依旧可以执行
var express = require('express'); var app = express(); app.use('/',function (req, res,next) { // send自带设响应头 res.send('hah'); next(); }); // 需求是让下面的路由执行 app.use('/qwe',function (req, res,next) { // 不带设置响应头 res.end('dadfa'); console.log(1); }); app.listen(3000);
出现错误
-
next函数主要是用来确保所有注册的中间件被一个接一个的执行,那么我们就应该在所有的中间件中调用next函数,但有一个特例,如果我们定义的中间件终结了本次请求,那就不应该再调用next函数,否则就可能会出问题,我们来看段代码
app.get('/a', function(req, res, next) { res.send('sucess'); next(); }); // catch 404 and forward to error handler app.use(function(req, res, next) { console.log(404); var err = new Error('Not Found'); err.status = 404; next(err); }) app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); });
发送请求"/a",控制台打印日志如下:
404
GET /a 500 6.837 ms - -
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:345:11)
为什么代码会抛异常呢,就是因为我们在res.send之后调用了next函数,虽然我们本次的请求已经被终止,但后边的404中间件依旧会被执行,而后边的中间件试图去向res的headers中添加属性值,所以就会抛出上边的异常。