Проблема проверки Joi с функцией min - PullRequest
0 голосов
/ 11 марта 2020

Я использую следующий код в express. js с использованием Joi и хочу проверить длину имени должна быть минимум 3 и не должна быть пустой, но минимум не работает, поэтому вам нужна ваша помощь здесь.

const Joi = require('@hapi/joi');
const express = require('express');

const app = express();

app.use(express.json());

//Define static array
const courses = [
  {id: 1, name:'course 1'},
  {id: 2, name:'course 2'},
  {id: 3, name:'course 3'},
];

app.get('/api/courses', (req, resp) => {
   resp.send(courses);
});

app.post('/api/courses', (req, resp) => {
   const schema = Joi.object({
     name: Joi.string()
           .max(3).required
           .messages({
               'string.max': 'Name should be max 3 characters..',
               'any.required': 'Name must not be empty...',
     }),
   }); 

   const { error } = schema.validate(req.body);

   if(error) {
     resp.status(400).json( {error: error.details[0].message});
     return;
   }
   const course = {
     id: courses.length + 1,
     name: req.body.name
   };

   courses.push(course);
   resp.send(course);
});

1 Ответ

1 голос
/ 11 марта 2020

В своем вопросе вы сказали, что «длина имени должна быть не менее 3», но применили правило max в вашей схеме.

Также вы забыли добавить скобки после требуемого.

Вам это нужно схема с `` min, пустыми и обязательными правилами.

  const schema = Joi.object({
    name: Joi.string()
      .min(3)
      .empty()
      .required()
      .messages({
        "string.min": `Name should be min {#limit} characters..`,
        "string.empty": "Name cannot be an empty field",
        "any.required": "Name is required"
      })
  });

Case1 : без поля имени

Запрос:

{

}

Ответ:

{
    "error": "Name is required"
}

Case2 : имя не указано

Запрос:

{
  "name": ""
}

Ответ:

{
    "error": "Name cannot be an empty field"
}

Case3 : имя состоит из 2 символов

Запрос:

{
  "name": "AB"
}

Ответ:

{
    "error": "Name should be min 3 characters.."
}

Также убедитесь, что вы отправляете тело запроса в необработанном виде JSON вот так:

enter image description here

Также убедитесь, что у вас есть этот Content-Type заголовок со значением application/json

enter image description here

...