Узел / Экспресс: Как проверить синтаксис тела запроса POST и ошибку ответа? - PullRequest
0 голосов
/ 28 ноября 2018

Проект представляет собой сервер API Node / Express, сгенерированный swagger-node-codegen .Его POST API необходим валидатор для проверки синтаксиса тела запроса.

Вот два примера проблемы:

  1. Если POST использует пустое тело запроса,
  2. Если POST использует тело запроса, включающее больше атрибутов, чем требуется,

, то сервер получит тело запроса и все равно будет работать как обычно, что отправляет значения в функции запроса.

Как правильно проверить синтаксис тела запроса POST и ответить на ошибку?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Этот - очень хороший модуль для проверки синтаксиса и значений тела запроса.Вот пример.

Вы можете создать вспомогательный модуль 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 и использовать его в своих контроллерах.

0 голосов
/ 29 ноября 2018

Я использую промежуточное ПО для проверки значений тела 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...