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

时间:2018-11-28 20:35:37

标签: node.js rest express

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

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

  1. 如果使用空的请求正文进行POST,
  2. 如果使用请求正文的POST所包含的属性超出了要求,

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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中添加整个应用的请求验证,并在控制器中使用它。

答案 2 :(得分:0)

以上解决方案都可以,但是它们存在一个用于验证正文,查询或参数的快速库

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

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/