为了账号安全,请及时绑定邮箱和手机立即绑定

Express 中的中间件链接

Express 中的中间件链接

喵喔喔 2021-11-12 16:17:51
我正在编写 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 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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


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

}


查看完整回答
反对 回复 2021-11-12
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

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


有道理?


查看完整回答
反对 回复 2021-11-12
?
萧十郎

TA贡献1815条经验 获得超13个赞

您可以指定多个中间件,请参阅app.use 文档:


以上任何一项的组合数组。


您可以创建所有中间件的文件,例如 -


中间件.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'));

注意 - 仅对所有此类请求通用的中间件执行此操作。


查看完整回答
反对 回复 2021-11-12
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号