繁体   English   中英

Node/Express:如何检查 POST 请求正文语法和响应错误?

[英]Node/Express: How to check POST request body syntax and response error?

该项目是一个 Node/Express API 服务器,由swagger-node-codegen生成。 它的 POST API 需要一个验证器来检查请求正文的语法。

以下是该问题的两个示例:

  1. 如果 POST 使用空请求正文,
  2. 如果使用包含比所需属性更多的属性的请求正文进行 POST,

服务器将接收请求正文并仍将正常处理,即向查询函数发送值。

检查 POST 请求正文的语法并响应错误的适当方法是什么?

我使用中间件来检查 POST 正文值: https : //expressjs.com/en/guide/using-middleware.html

router.post('/create', validateEmpty, (req, res) => {
    res.status(200).send({result: "OK"})
})

const validateEmpty = (req, res, next) => {
    let value = req.body.value;
    if(value.length === 0) {
        return res.status(500).send({
            error: "empty value"
        });
    }
    // if string value is longer than 0, continue with next function in route
    next();
}

是用于验证请求正文语法和值的非常好的模块。 这是一个例子。

您可以创建一个辅助模块requestValidator.js来验证所有路由请求。 考虑注册 API。

const Joi = require('joi');

module.exports = {
  // auth
  validateSignUp: (input) => {
    const schema = Joi.object().keys({
      firstName: Joi.string().required(),
      lastName: Joi.string().required(),
      email: Joi.string().email({ minDomainAtoms: 2 }).required(),
      password: Joi.string().min(6).max(20).required(),
      confirmPassword: Joi.string().valid(Joi.ref('password')).required().options({
        language: { 
          any: { 
            allowOnly: 'must match password' 
          }
        }
      }),
      gender: Joi.string().required(),
      address: addressSchema.required(),
    });

    return Joi.validate(input, schema);
  },
}

在你的authController.js

const { validateSignUp } = require('../helpers/requestValidation');

module.exports = {
    signUp: async (req, res, next) => {
        const body = req.body;
        // validation
        const { error } = validateSignUp(body);
        if(error) return res.status(400).json({
            success: false,
            message: error
        });

        const user = await User.findOne({ email: email.toLowerCase() });
        if(user) {
            return respondFailure(res, 'the email address you have entered is already registered');
        }

      const newUser = new User(body);
      await newUser.save();

        return res.status(400).json({
            success: true,
            message: 'user registered successfully',
            data: newUser
        });
    },
}

您可以在requestValidator.js添加整个应用程序的请求验证并在您的控制器中使用它。

上述解决方案有效,但它们存在一个用于验证 body、query 或 params 的快速库

您可以按照以下步骤操作。

1)。 首先通过此命令安装库。

npm install --save express-validator

2)。 现在你的路由被定义了,导入这个

const { body, query, param } = require("express-validator");

3)。 现在在您的路线中,您可以使用上述任何一个对象示例..

router.post('/upload',
    [
        query('id')
            .not()
            .isEmpty()
            .withMessage('id field can not be empty')
            .matches(/^[0-9]+$/)
            .withMessage('id must be integer only'),
        body('fullName')
            .trim()
            .not()
            .isEmpty()
            .withMessage('fullName can not be empty')
            .matches(/^[A-Za-z]+$/)
            .withMessage('fullName must be Alpha only')
    ],
    userController.fetchProperty
);

他们在包中定义了许多方法,因为我在上面的例子中使用了其中的一些,如 isEmpty()、matches()、isInt() 等。

4)。 现在在定义逻辑的控制器中,您首先需要导入它

const { validationResult } = require("express-validator");

5)。 现在在你的逻辑中,你只需要通过传递 req, res 对象来调用这个函数

const checkInputError = (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        res.status(422).json({
          message: 'failure',
          status: 422,
          errors: errors.array()
        });
    }
};

现在,您将收到整个验证错误,作为应用于正文、查询或参数的响应。

希望这会帮助你或其他人!

更多查询可以参考这里。

https://express-validator.github.io/docs/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM