Wydaje się dość proste, aby zatwierdzić wejście użytkownika w NODE.JS REST API z Joi.

Ale problem polega na tym, że moja aplikacja nie jest napisana w języku angielskim. Oznacza to, że muszę wysłać niestandardowe wiadomości pisemne do użytkownika Frontend.

Zajmowałem się tym i znalazłem tylko problemy.

Może ktoś mógłby dla tego rozwiązać?

Jest to kod, którego używam, aby zatwierdzić system Joi:

    var schema = Joi.object().keys({
      firstName: Joi.string().min(5).max(10).required(),
      lastName: Joi.string().min(5).max(10).required()
      ..
    });

    Joi.validate(req.body, schema, function(err, value) {
      if (err) {
        return catched(err.details); 
      }
    });

    function catched(reject) {
      res.json({
        validData: false,
        errors: reject
      });
    }

Plus, czy istnieje sposób na użycie Joi w boku klienta?

Dzięki!

51
Raz 10 luty 2018, 15:48

10 odpowiedzi

Najlepsza odpowiedź

Znalazłem rozwiązanie, które znalazłem:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
  lastName: Joi.string().min(5).max(10).required()
  ..
});

Następnie wydrukuj label z zmiennej {X0}}

17
Raz 10 luty 2018, 20:07

joi wersja 14.0.0

const SchemaValidation = {
  coins: Joi.number()
    .required()
    .error(() => {
      return {
        message: 'Coins is required.',
      };
    }),
  challenge_name: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge name is required.',
      };
    }),
  challengeType: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge type is required.',
      };
    }),
  challengeDescription: Joi.string()
    .required()
    .error(() => {
      return {
        message: 'Challenge description is required.',
      };
    }),
};

W błędy obiektu można uzyskać, typ błędu i zmienić komunikat zgodnie z.

31
Ashish Kadam 30 kwiecień 2020, 18:27

Rozszerzenie na ASHISH ASSERSASE, jeśli masz wiele różnych typów błędów, możesz sprawdzić, jaki jest obecny rodzaj błędu i ustaw Jego wiadomość odpowiednio:

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.type) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = `Value should have at least ${err.context.limit} characters!`;
          break;
        case "string.max":
          err.message = `Value should have at most ${err.context.limit} characters!`;
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});

Możesz sprawdzić listę błędów tutaj: joi 14.3 0,1 API Reference & GT; Błędy i GT; Lista błędów

Możesz także sprawdzić {x0}} Odniesienie o więcej informacji. Biorąc pod uwagę dokumenty:

Zastępuje domyślny błąd Joi za pomocą błędu niestandardowego, jeśli reguła nie powiedzie się:

  • err może być:
    • instancja Error - błąd zastępowania.
    • a function(errors), biorąc tablicę błędów jako argument, gdzie musi też:
      • Zwróć string - zastępuje komunikat o błędzie za pomocą tego tekstu
      • Zwróć pojedynczy object lub Array, gdzie:
        • {x6}} - Opcjonalny parametr zapewniający typ błędu (np. {X7}}).
        • {x8}} - Opcjonalny parametr Jeśli podano template, zawierający tekst błędu.
        • {X10}} - Opcjonalny parametr Jeśli message jest dostarczany, zawierający ciąg szablonu, przy użyciu tego samego formatu jak zwykłe błędy języka joi.
        • {x12}} - Opcjonalny parametr, aby zapewnić kontekst błędu, jeśli używasz {{x13}}.
      • Zwróć {{x14}} - tak samo, jak gdy bezpośrednio podajesz {{x15}}, ale możesz dostosować komunikat o błędzie na podstawie błędów.
  • options:
    • {X1}} - Wartość Boolean wskazująca, czy obsługiwacz błędu powinien być używany do wszystkich błędów lub tylko dla błędów występujących na tej właściwości (true wartość). Koncepcja ta ma sens dla array lub object schematy, ponieważ inne wartości nie mają dzieci. Domyślnie do false.
29
Guillermo Gutiérrez 12 luty 2019, 19:50

Edytuj :

Upewnij się, że używasz @hapi/joi - https://www.npmjs.com/package / @ HAPI / JOI, wersja 16 i powyżej .


Oryginalna odpowiedź :

Obecny sposób (osobiście uważam go lepiej) jest użycie .messages() (lub {x1}}).

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

const joiSchema = Joi.object({
  a: Joi.string()
    .min(2)
    .max(10)
    .required()
    .messages({
      'string.base': `"a" should be a type of 'text'`,
      'string.empty': `"a" cannot be an empty field`,
      'string.min': `"a" should have a minimum length of {#limit}`,
      'any.required': `"a" is a required field`
    })
});

const validationResult = joiSchema.validate({ a: 2 }, { abortEarly: false });
console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'

Wykorzystanie .errors() jest Nie zalecane tylko do aktualizacji Domyślna wiadomość z niestandardową wiadomością.

.prefs({ messages }) to skomplikowany sposób zapewnienia większej liczby opcji jako preferencji. Inne opcje prefs są pobierane bezpośrednio z opcji .validate ().

Dalsze czytaj: https://github.com/hapijs/ai/issues/2158


Aktualizacja 1 : Widziałem, że powyższe wyjaśnienie nie wypracowały dla niektórych ludzi, więc umieściłem jakiś kod do testowania siebie. Sprawdź tutaj: https://runkit.com/embed/fnfaq3J0Z9L2

Zaktualizowano również fragment kodu udostępniony wcześniej, aby mieć szczegóły z włączenia pakietów, do użycia, aby wywołać rzeczywisty metodę walidacji.


Update 2 : Lista typów błędów joi i ich opis (dla .messages() - jak string.base, array.UNIQUE, DATE.MIN itp.) Jest dostępny Tutaj.

16
Rvy Pandey 1 maj 2020, 09:42

Możesz użyć .Error (nowy błąd ("wiadomość")) , a jego praca dla mnie

var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for first name')),
  lastName: Joi.string().min(5).max(10).required().error(new Error('Give your error message here for last name'))
  ..
});

Joi.validate(req.body, schema, function(err, value) {
  if (err) {
    console.log(err.message)
    return catched(err.message); 
  }
});
9
Sameer Ek 22 luty 2018, 06:54

Rozwiązanie , aby dodać niestandardowe wiadomości: Po prostu dodaj kolejną funkcję przykuwaną, aby rzucić błąd podczas definiowania schematu.
W Twoim przypadku

 firstName: Joi.string().min(5).max(10).required().error(new Error('I am a custom error and I know it!')),

Odpoczynek pozostanie taki sam.

Rozwiązanie do użycia joi przy stronie klienta (Twoje drugie pytanie)

Joi-Browser jest pakietem, który umożliwia użycie tego samego schematu na stronie klienta.

Tutaj jest ciekawą dyskusją, na którą możesz spojrzeć.

Twoje zdrowie!

3
Syeda Aimen Batool 8 maj 2018, 22:46

pozwól schema = joi.object ({ Foo: Joi.Number (). Min (0) .Error (() = & gt; '"foo" wymaga numeru dodatnia ") });

Dokumenty Link

3
Max Sherbakov 25 maj 2018, 14:15

Dla każdego, kto ma problem z

... wiadomości nie jest funkcją

Błędy, musisz zainstalować joi za pomocą npm install @hapi/joi i importowanie go za pomocą @hapi/joi. Popełniłem błąd instalacji joi bez prefiksu @hapi/ i zajęło mi błąd, aby znaleźć błąd.

1
Corentin Pane 20 październik 2019, 05:26

Wystarczy zadzwonić "Funkcja komunikatu ()":

firstName: Joi.string().message("Your custom message")
1
Chavin Kwas 19 kwiecień 2020, 13:04
let schema = Joi.object().keys({
   Joi.string().required().options({language: {any: {required: "First name is required"}}})
});
0
yatinsmile 26 luty 2019, 05:42