【问题标题】:Node/Express: How to check POST request body syntax and response error?Node/Express:如何检查 POST 请求正文语法和响应错误?
【发布时间】:2020-01-24 01:48:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您想了解在发送登录帖子的情况下,该帖子应包含例如电子邮件和密码,并且在缺少此信息的情况下执行错误处理吗?
  • 仅用于登录或缺席,寻找一种适当的方式从服务器端对请求正文语法进行验证,以及响应错误。

标签: node.js rest express


【解决方案1】:

我使用中间件检查 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();
}

【讨论】:

  • 非常感谢!这对我理解中间件功能有很大帮助。
【解决方案2】:

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

您可以创建一个帮助模块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 中添加整个应用的请求验证,并在您的控制器中使用它。

【讨论】:

  • 非常感谢!但是我的项目包含了很多自定义验证,所以最后在最后一个答案中使用了中间件函数的方式。
【解决方案3】:

上述解决方案有效,但它们存在一个用于验证正文、查询或参数的快速库

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

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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2019-10-21
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多