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

Node.js Node/Express:如何检查POST请求正文语法和响应错误?,node.js,rest,express,Node.js,Rest,Express,该项目是一个节点/Express API服务器,由生成。它的POST API需要一个验证器来检查请求体的语法 以下是这一问题的两个例子: 如果POST使用空请求正文 如果POST使用的请求正文包含的属性多于所需的属性 服务器将接收请求主体,并且仍将正常处理,这将向查询函数发送值 检查POST请求正文的语法并响应错误的适当方法是什么?我使用中间件检查POST正文值: 是验证请求正文语法和值的非常好的模块。这里有一个例子 您可以创建一个helper模块requestValidator.js,用于验证

该项目是一个节点/Express API服务器,由生成。它的POST API需要一个验证器来检查请求体的语法

以下是这一问题的两个例子:

  • 如果POST使用空请求正文
  • 如果POST使用的请求正文包含的属性多于所需的属性
  • 服务器将接收请求主体,并且仍将正常处理,这将向查询函数发送值


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

    我使用中间件检查POST正文值:

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

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

    上述解决方案可以工作,但它们存在一个用于验证正文、查询或参数的express库

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

    1) 。首先使用此命令安装库

    npm install --save express-validator
    
    2) 。现在,在定义路由的位置,导入此

    const { body, query, param } = require("express-validator");
    
    const { validationResult } = 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 { body, query, param } = require("express-validator");
    
    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()
            });
        }
    };
    
    现在,您将在body、query或param中得到整个验证错误作为响应

    希望这能帮助你或其他人

    有关更多查询,请参阅此处


    如果发送包含电子邮件和密码的登录帖子,并且在没有这些信息的情况下执行错误处理,您想了解吗?不只是针对登录或缺席,正在寻找从服务器端使用请求正文语法验证以及响应错误的适当方法。非常感谢!这对我理解中间件功能有很大帮助。非常感谢!但我的项目包含许多自定义验证,因此在最后一个答案中使用了中间件功能的方式。