javascript - Express 中的中间件链接

标签 javascript node.js api express middleware

我正在编写 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();
    }

谢谢。

最佳答案

通常我不会直接从另一个中间件调用中间件。它混合了中间件逻辑的职责和中间件的使用位置。

Express 的可配置性比您想象的要高得多。您还可以在公共(public)路径中安装公共(public)中间件:

  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. 如果只有特定模式网址使用中间件:

    // 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 都使用中间件。例如,假设 /route/... 中的所有 url 都使用中间件:

    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);
}

关于javascript - Express 中的中间件链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279138/

相关文章:

java - 如何使用 Softlayer API 订购公共(public)和私有(private) Vlan

python - yfinance 不工作 - 接收 json.decoder.JSONDecodeError

javascript - Mocha 单元测试中的 Promise

javascript - 如何设置空值或 null 值在 Jquery 更改中不起作用

javascript - 使用嵌套/多维可观察的剑道模板

node.js:找不到模块 'ico'

node.js - Jade 模板布局不能与 Node.js 结合使用

javascript getdisplaymedia 以更高分辨率记录

javascript - 无效传输,必须是具有日志方法的对象 winston mongodb logging

api - 2015年4月20日之后的YouTube数据API V2.0