在ExpressJS中为特定路由链接多个中间件

时间:2015-08-10 20:20:10

标签: node.js express middleware

我想验证一些东西,但无法在Express文档或网上找到任何关于此的内容(虽然我知道这是一个功能)。

我可以测试一下,但我没有一个很好的模板,并希望听到社区的消息。

如果我在快递中定义路线如下:

app.get('/', function (req, res) {
  res.send('GET request to homepage');
});

我还可以定义一个中间件并直接加载它,例如

middleware = function(req, res){
  res.send('GET request to homepage');
});

app.get('/', middleware)

但是,我也可以链接这些路由中的至少一个以运行额外的中间件,例如身份验证,如下:

app.get('/', middleware, function (req, res) {
  res.send('GET request to homepage');
});

这些可以无限链接吗?如果我愿意,我可以在给定的路线上粘贴10个中间件功能吗?我想看看app.get可以接受的参数,但提到我在文档中找不到它。

3 个答案:

答案 0 :(得分:67)

请考虑以下示例:

var middleware = {
    requireAuthentication: function(req, res, next) {
        console.log('private route list!');
        next();
    },
    logger: function(req, res, next) {
       console.log('Original request hit : '+req.originalUrl);
       next();
    }
}

现在,您可以使用以下代码添加多个中间件:

app.get('/', [middleware.requireAuthentication, middleware.logger], function(req, res) {
    res.send('Hello!');
});

因此,从上面的代码中,您可以看到“requireAuthentication”和“logger”是两个不同的中间件。

答案 1 :(得分:34)

它没有说"无限"但它确实说你可以在文档中添加多个中间件功能(称为"回调" here

  

router.METHOD(path,[callback,...] callback)

     

...

     

你可以提供多个回调,并且所有回调都是平等的,并且行为就像中间件一样,除了这些回调可能会调用下一个(' route')以绕过剩余的路径回调(S)。您可以使用此机制在路由上执行前置条件,然后在没有理由继续匹配路由时将控制权传递给后续路由。

正如您所看到的,中间件函数和通常处理请求的函数(通常是添加到列表中的最后一个函数的函数)之间没有区别。

10不应该是一个问题(如果你真的需要)。

答案 2 :(得分:3)

快速版本“ express”:“ ^ 4.17.1”或更高版本

从文档:中间件系列

var r1 = express.Router();
r1.get('/', function (req, res, next) {
  next();
});

var r2 = express.Router();
r2.get('/', function (req, res, next) {
  next();
});

app.use(r1, r2);

让我们尝试一个真实的例子:

tourController.js

 exports.checkBody = (req, res, next)=>{ // middleware 1
    if (!req.body.price){
        return res.status(400).json({
            status:'fail',
            message:'Missing price!!!'
        })
    }
    next();
  }

 exports.createTour = (req, res) => { // middleware 2
    tours.push(req.body);
    fs.writeFile(
      `${__dirname}/dev-data/data/tours-simple.json`,
      JSON.stringify(tours),
      (err) => {
        res.status(201).json({
          status: 'success',
          data: {
            tour: newTour,
          },
        });
      }
    );
  };

tourRouter.js

const express = require('express');
const tourController = require('./../controller/tourController')
const router = express.Router();

router.route('/')
.get(tourController.getAllTours)
.post(tourController.checkBody, tourController.createTour); 
//muliple Middleware in post route

app.js

const express = require('express');
const tourRouter = require('./route/tourRouter');
const app = express();

app.use(express.json());
app.use('/api/v1/tours', tourRouter);
module.exports = app;