当前位置: 首页 > 知识库问答 >
问题:

使用中间件验证路由器中主体参数的Express Typescript API

毕宇
2023-03-14

Im使用路由器类管理我的所有路由:

const router = express.Router();
/**
 * User Sign up Route at /api/auth/register
 */
router.post(
  "/register",
  checkBodyParameters(['username', 'email', 'password']),
  verifyRegister.ensurePasswordStrength,
  verifyRegister.checkUsernameAndEmail,
  AuthController.register
);
export = router;

我想检查x-www-form-urlencoded主体参数。以查看键是否不是它应该是的,或者值是否为空。

我编写了一个中间件函数来检查:

import { Request, Response } from "express";

export default function checkBodyParameters(
  bodyParams: Array<string>,
  req: Request,
  res: Response,
  next
) {
  let requestBodyParams: Array<string> = [];
  requestBodyParams.push(req.body.username, req.body.email, req.body.password);
  requestBodyParams.forEach((requestBodyParam) => {
    if (bodyParams.includes(requestBodyParam)) {
      if (requestBodyParam !== "") {
        next();
      } else {
        res.status(400).json({
          message: "Paremeter cant be empty",
          value: requestBodyParam,
        });
      }
    } else {
      res
        .status(400)
        .json({ message: "Paremeter not specified", value: requestBodyParam });
    }
  });
}

但它似乎不喜欢我将参数传递给中的中间件函数

checkBodyParameters(['username', 'email', 'password'])

我的问题是,我如何创建一个中间件函数,它接受比req、res和next更多的值?以及如何在路由器实例中正确使用此功能。

欢迎任何反馈

共有1个答案

何博涛
2023-03-14

您正在调用函数,而不是返回一个函数作为中间件。

请使用:

const checkBodyParameters = (
  bodyParams: Array<string>
) => (
  req: Request,
  res: Response,
  next
) => {
  let requestBodyParams: Array<string> = [];
  requestBodyParams.push(req.body.username, req.body.email, req.body.password);
  requestBodyParams.forEach((requestBodyParam) => {
    if (bodyParams.includes(requestBodyParam)) {
      if (requestBodyParam !== "") {
        next();
      } else {
        res.status(400).json({
          message: "Paremeter cant be empty",
          value: requestBodyParam,
        });
      }
    } else {
      res
        .status(400)
        .json({ message: "Paremeter not specified", value: requestBodyParam });
    }
  });
}

export default checkBodyParameters
 类似资料:
  • 我的路线是这样的: 这个路由检查,如果用户是登录之前调用免费下载方法.如果不是,登录表单出现。 然后用户需要登录并且登录控制器返回家并且用户需要再次点击路线按钮('product.free')以便访问路线名称product.free。 有一种方法调用ProductController@freeDownload方法只是在登录后,如果用户点击按钮之前? 希望我或多或少是清楚的。 这里我的登录控制器:

  • 概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大神,只不过在本地实践了而已,对于 Go 语言的使用,我还是个新人,在这里感谢大家的厚爱! 这篇文章咱们分享:路由中间件 - 签名验证。 为什么使用签名验证? 这个就不用多说了吧,主要是为了保证接口安全

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 我正在使用react路由器(2.4.1),我有一个通配符(path=“*”)回退路由来显示“未找到”组件。 我的其中一条路线定义如下: 我可以以任何方式验证路由参数,以检查该类别是否存在于我的类别列表中?如果没有,我希望路由器下降到通配符,以便显示未找到组件

  • 我有一个后api,有对象,但我不能打印在控制台上它的下载未定义我以为我错过了身体解析器,但添加身体解析器后,我看到错误身体解析器弃用身体解析器:使用个人json/urlencoded middlewares将不胜感激。 路线。js 应用程序。js

  • 将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product