首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在每个路由调用上执行中间件

在每个路由调用上执行中间件
EN

Stack Overflow用户
提问于 2022-01-14 12:22:25
回答 4查看 262关注 0票数 2

在我的快速应用程序中,我用routes.ts实现了路由:

代码语言:javascript
运行
复制
    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)
    });

和express.ts:

代码语言:javascript
运行
复制
    export const App = express()

    App.use(express.json())
    App.use(express.urlencoded({ extended: true }))
    App.use(helmet())

    App.use('/', Router)

在每个路由器呼叫时,我想执行一段代码service.setParameter(req),它从“params”中获取特定的参数,但是我不想显式地添加到每个路由器方法中。

在路由器之前和之后,我尝试将其作为中间件添加

代码语言:javascript
运行
复制
    App.use('/', Router)

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

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

如何以通用方式执行service.setParameter(req),以便将其应用于所有路由?

EN

回答 4

Stack Overflow用户

发布于 2022-01-15 02:36:13

express.ts文件中,您可以添加一个中间件,它可以在挂载路由器之前完成,然后使用next()进行处理。你可以这样做:

代码语言:javascript
运行
复制
App.use('/*', (req, res, next) => {
  service.setParameter(req);
  next();
});

App.use('/', Router)
票数 2
EN

Stack Overflow用户

发布于 2022-01-14 12:45:55

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

代码语言:javascript
运行
复制
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'的所有请求中。

票数 0
EN

Stack Overflow用户

发布于 2022-01-15 02:08:15

您可以使用app.use(async (req,res,next) => {...})来声明在所有请求中执行的中间件,如果希望首先调用该中间件,则必须在路由之前声明该中间件,中间件必须调用next()才能继续执行流程,如果您希望在请求结束时被调用,则必须将其放在声明的末尾但在错误中间件之前,在这种方法中,每个路由都必须在功能结束时调用next()

优先逼近

代码语言:javascript
运行
复制
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);

第二次逼近

代码语言:javascript
运行
复制
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");
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70710503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档