代码之家  ›  专栏  ›  技术社区  ›  positron

对每个路由调用执行中间件

  •  0
  • positron  · 技术社区  · 4 年前

    在我的Express应用程序中,我在routes中实现routes。ts:

        var Router = express.Router();
    
        Router.route('/models/:modelId')
          .get(function (req, res) {
              service.setParameter(req)
              service.get(req,res)
        });
     
         Router.route('/models/:modelId')
          .post(function (req, res) {
              service.setParameter(req)
              service.post(req,res)
        });
    

    快车。ts:

        export const App = express()
    
        App.use(express.json())
        App.use(express.urlencoded({ extended: true }))
        App.use(helmet())
    
        App.use('/', Router)
    

    在每次路由器调用时,我都要执行一段代码服务。setParameter(req),它从“params”获取特定参数,但我不想显式地添加到每个路由器方法中。

    我尝试在路由器前后添加它作为中间件

        App.use('/', Router)
    
        App.use(function(req, res, next){
          service.setParameter(req)
          next()
        })
    

    但如果我在路由器之前定义它,那么路由还没有被设置,并且我没有得到我想要的参数,如果我在路由器之后定义它,那么中间件就不会被执行。

    如何执行服务。以通用方式设置参数(req),使其适用于所有路由?

    0 回复  |  直到 4 年前
        1
  •  2
  •   NeNaD    4 年前

    在里面 express.ts 文件,您可以添加一个中间件,该中间件将在堆起路由器之前完成此操作,然后使用 next() .你可以这样做:

    App.use('/*', (req, res, next) => {
      service.setParameter(req);
      next();
    });
    
    App.use('/', Router)
    
        2
  •  0
  •   eol    4 年前

    您需要将自定义中间件放在上下文路径和路由器之间 app.use(..) :

    const router = express.Router();
    router.post('/', (req, res) => {
        service.post(req,res);
    });
    
    router.get('/', (req, res) => {
        service.get(req,res)
    });
    
    app.use('/models', (req, res, next) => {
        service.setParameter(req);
        next();
    }, router);
    

    使用上述代码,中间件将被排除在所有请求之外 '/models' .

        3
  •  0
  •   Andres Rene Gutierrez T    4 年前

    你可以用 app.use(async (req,res,next) => {...}) 为了声明一个在所有请求中执行的中间件,如果你想首先调用这个中间件,它必须在你的路由之前声明,中间件必须调用 next() 为了继续执行流程,如果您希望在请求结束时被调用,您必须在声明结束时,但在错误中间件之前,在这种方法中,每个路由都必须调用 下一个() 在你的活动结束时。

    第一种方法

    const express = require('express');
    const app = express();
    const router = express.Router();
    router.post('/', async (req, res) => {
        await service.post(req,res);
    });
    
    router.get('/', async (req, res) => {
        await service.get(req,res)
    });
    
    app.use((req,res,next) => {
       console.log("always called");
       next();
    });
    app.use('/',router);
    

    第二种方法

    const express = require('express');
    const app = express();
    const router = express.Router();
    router.post('/', async (req, res, next) => {
        await service.post(req,res);
        next();
    });
    
    router.get('/', async (req, res, next) => {
        await service.get(req,res);
        next();
    });
    
    app.use('/',router);
    app.use((req,res) => {
       console.log("always called");
    });
    
        4
  •  0
  •   positron    4 年前

    感谢所有的答案,它们帮助我更好地理解了快递路线是如何工作的。

    我找到了另一个解决方案,我认为在我的情况下效果最好——使用路由器。all()方法:

    const setRequest = function(req, res, next){
      logger.setRequest(request)
      next()
    }
    
    Router.route('/models/:model_id')
    .all(setRequest)
    .get(function (req, res) {service.execute()})
    .put(function (req, res) {service.execute()})
    
    推荐文章