Express 中的中间件链接

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

    }

谢谢。


喵喔喔
浏览 194回答 3
3回答

缥缈止盈

通常我不会直接从另一个中间件调用中间件。它混合了中间件逻辑的职责和使用中间件的位置。Express 的可配置性比您想象的要高得多。您还可以在公共路径中安装公共中间件:如果所有路由都使用中间件:// 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);如果只有特定的 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);如果子路径中的所有 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);}

回首忆惘然

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 consumeroute1.post(routesMiddleware(pureVaidationsFunctions1))route2.post(routesMiddleware(pureVaidationsFunctions2))有道理?

萧十郎

您可以指定多个中间件,请参阅app.use 文档:以上任何一项的组合数组。您可以创建所有中间件的文件,例如 -中间件.jsmodule.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'));注意 - 仅对所有此类请求通用的中间件执行此操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript