Цепочка промежуточного программного обеспечения в Express - PullRequest
0 голосов
/ 08 октября 2019

Я пишу API и хотел понять, как можно добавить промежуточное программное обеспечение для нескольких маршрутов. Промежуточное ПО выполняет те же действия на каждом маршруте, как проверка хостов / ip, проверка пользователя и т. Д. Объект req загружается другими объектами в каждом промежуточном программном обеспечении, такими как req.host, req.ip, req.username и т. Д.

    app.post("/route1", middleware1, middleware2, middleware3, middleware4);
    app.post("/route2", middleware1, middleware2, middleware3, middleware4);

    const middleware1 = (req, res, next) => {
     // does something to validate user
     req.username = "username"
     next();
    }
    const middleware2 = (req, res, next) => {
     // host validation
     req.host = "something modified in validation"
     next();
    }
    const middleware3 = (req, res, next) => {
     // checks for mac and ip
     req.mac = "mac addr"
     next();
    }
    const middleware4 = (req, res, next) => {
     res.send();
    }

Или как-то так:


    app.post("/route1", middleware1);
    app.post("/route2", middleware1);


    const middleware1 = (req, res) => {
      // does something to validate user
      req.username = "username"
      middleware2(req, res);
    }
    const middleware2 = (req, res) => {
      // host validation
      req.host = "something modified in validation"
      middleware3(req, res);
    }
    const middleware3 = (req, res) => {
      // checks for mac and ip
      req.mac = "mac addr"
      middleware4(req, res);
    }
    const middleware1 = (req, res) => {
      res.send();
    }

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 октября 2019
const express = require('express')
const { routesMiddleware } =require('./middlewares')
const { pureVaidationsFunctions1 } =require('./services')

const rout1 =express.Router()
const rout2 =express.Router()

const app = express()

app.use('/route1',route1)
app.use('/route2',route2)

// routesMiddleware a middleware to handle the execution of list of functions

// pureVaidationsFunctions1 list of funtions that `routesMiddleware` will consume
route1.post(routesMiddleware(pureVaidationsFunctions1))
route2.post(routesMiddleware(pureVaidationsFunctions2))

имеет смысл?

0 голосов
/ 08 октября 2019

Вы можете указать несколько промежуточных программ, см. app.use docs :

Массив комбинаций любых из перечисленных выше.

Вы можете создать файл всех промежуточных программ, таких как -

middlewares.js

module.exports = [
  function(req, res, next){...},
  function(req, res, next){...},
  function(req, res, next){...},
  .
  .
  .
  function(req, res, next){...},
]

и просто добавить его, например:

/*
you can pass any of the below inside app.use()
A middleware function.
A series of middleware functions (separated by commas).
An array of middleware functions.
A combination of all of the above.
*/
app.use(require('./middlewares.js'));

Примечание - Делайте это только для тех промежуточных программ, которые будут общими для всех таких запросов.

0 голосов
/ 08 октября 2019

Обычно я бы не стал вызывать промежуточное ПО напрямую из другого промежуточного ПО. Он сочетает в себе функции логики промежуточного программного обеспечения и место использования промежуточного программного обеспечения.

Express гораздо более настраиваемый, чем вы думаете. Вы также можете установить общие промежуточные программы по общим путям:

  1. Если все маршруты используют промежуточные программы:

    // How common middlewares are normally installed:
    app.post(middleware1);
    app.post(middleware2);
    app.post(middleware3);
    app.post(middleware4);
    
    // Alternative, less common way to do it:
    app.post(middleware1,middleware2,middleware3,middleware4);
    
  2. Если только определенный шаблон URL-адресов использует промежуточное программное обеспечение:

    // Use a regexp:
    app.post(/route(1|2)/, middleware1, middleware2, middleware3, middleware4);
    
    // Or if you don't like regexp, use globs:
    app.post('route*', middleware1, middleware2, middleware3, middleware4);
    // Or a more specific glob pattern:
    app.post('route1?2?', middleware1, middleware2, middleware3, middleware4);
    
  3. Если все URL-адреса в подпути используют промежуточное программное обеспечение. Например, допустим, что все URL-адреса в /route/... используют промежуточное программное обеспечение:

    const route = express.Router();
    
    app.use('/route',route);
    route.post(middleware1);
    route.post(middleware2);
    route.post(middleware3);
    route.post(middleware4);
    

Если ни один из вышеперечисленных вариантов не подходит вам, вы все равно можете использовать свой второй вариант, новместо того, чтобы вызывать промежуточное программное обеспечение внутри друг друга, вы пишете промежуточное программное обеспечение для инициализации промежуточного программного обеспечения:

function commonMiddlewares (req, res, next) {

    middleware1(req,res,function() {
        middleware2(req,res,function() {
            middleware3(req,res,function() {
                middleware4(req,res,next);
            });
        });
    });
}

, которое можно записать менее вложенным способом:

function commonMiddlewares (req, res, next) {
    function runMiddleware4 () {
        middleware4(req,res,next);
    }
    function runMiddleware3 () {
        middleware3(req,res,runMiddleware4);
    }
    function runMiddleware2 () {
        middleware2(req,res,runMiddleware3);
    }

    middleware1(req,res,runMiddleware2);
}
...