【问题标题】:How to call router level middleware conditionally?如何有条件地调用路由器级中间件?
【发布时间】:2021-10-20 13:36:11
【问题描述】:

我有两个函数来验证请求正文,validation1validation2。 现在我的任务是,在解析传入的请求正文后, 如果用户角色是premium user,我需要使用validation1 验证数据,否则我将使用validation2 验证数据。

我尝试如下解决它,但无济于事。由于某种原因,验证中间件没有被调用。

const express = require('express');
const router = express.Router();
   
const { userController } = require('./controllers');

router.route('/check').post(
  (req, res, next) => {
    if (req.role === 'premium user') {
      validation1(someInformation);
    } else {
      validation2(someInformation);
    }
    next();
  },
  userController.check
);


const validation1 = (someInformation) => (req, res, next) => {
  // codes
  return next();
}

const validation2 = (someInformation) => (req, res, next) => {
  // codes
  return next();
}

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 尝试删除router.route('/check').post(中的next()

标签: node.js express express-router


【解决方案1】:

您应该将回调函数next 传递给验证函数。

还可以像下面的代码一样更改您的验证功能:

const express = require('express');
const router = express.Router();
   
const { userController } = require('./controllers');

router.route('/check').post(
  (req, res, next) => {
    if (req.role === 'premium user') {
      validation1(req, res, next);
    } else {
      validation2(req, res, next);
    }
  },
  userController.check
);


const validation1 = (req, res, next) => {
  // codes
  return next();
}

const validation2 = (req, res, next) => {
  // codes
  return next();
}

【讨论】:

  • 我对我的代码进行了一些编辑。你能再检查一下我的代码吗?
  • validation1validation2 是你的函数,你可以传递任意数量的参数。如果您需要传递更多参数,那么您可以在调用期间传递 validation1(someInformation, req, res, next); 并在定义时接受 const validation1 = (someInformation, req, res, next) => {
  • 为什么要创建 const validation1 = (someInformation) => (req, res, next) => 这样的函数?如果像这样创建函数,你有两个调用函数两次validation1(someInformation)(req, res, next)
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2017-04-20
  • 1970-01-01
  • 2021-06-12
  • 2022-09-23
相关资源
最近更新 更多