亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號