node中express的next方法

next方法

next的作用是什么?

  1. 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中添加属性值,所以就会抛出上边的异常。

猜你喜欢

转载自blog.csdn.net/qq_44352182/article/details/89891118