.when () при проверке joi, чтобы проверить один ключ на основе другого ключа

Администратор создаст пользователей, и при этом он будет вводить случайную строку в качестве пароля. Когда администратор редактирует существующего пользователя, ему не нужно вводить пароль, если он не хочет его менять. Если администратор не вводит пароль, будет использован старый пароль.

Поэтому я пытаюсь использовать .when() для решения этого дела. Когда _id существует в полезной нагрузке (что возможно только при наличии пользователя), тогда мы должны сделать поле пароля необязательным, иначе пароль требуется.

Вот моя проверка Joi

const usersJoiSchema = Joi.object({
  _id: Joi.string().optional(),
  firstName: Joi.string().required(),
  lastName: Joi.string().required(),
  email: Joi.string().required(),
  password: Joi.string().when('_id', { is: Joi.exist(), then: Joi.optional(), otherwise: Joi.required() })
})

У Джои есть метод .when на случай таких случаев. Но по какой-то странной причине это дает мне

{"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"}

как ответ api, и в консоли сервера ничего нет. Я попытался сравнить длину строки для _id вместо exists(), и я также пробовал

password: Joi.string().when('_id', { is: Joi.string().required(), then: Joi.string().optional(), otherwise: Joi.string().required() }),

password: Joi.string().when('_id', { is: Joi.string(), then: Joi.string().optional(), otherwise: Joi.string().required() }),

для ключа пароля, но все та же проблема.

Если у кого-то есть какие-либо идеи по этому поводу, пожалуйста, помогите мне.


person Rajeshwar    schedule 09.01.2019    source источник
comment
Ошибка 500 довольно бессмысленна. Какая ошибка в журналах вашего приложения?   -  person Ankh    schedule 11.01.2019
comment
Как я уже упоминал в описании выше, в журналах нет ошибок.   -  person Rajeshwar    schedule 15.01.2019


Ответы (2)


Итак, я создал простой тест, и все условия выполнены в соответствии с вашими требованиями. Я считаю, что в вашем коде есть что-то еще, что вызывает эту ошибку. Вот мой тестовый код, пожалуйста, взгляните.

const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.it;
const expect = require('code').expect;
const Joi = require('joi');

const usersJoiSchema = Joi.object({
    _id: Joi.string().optional(),
    firstName: Joi.string().required(),
    lastName: Joi.string().required(),
    email: Joi.string().required(),
    password: Joi.string().when('_id', {is: Joi.exist(), then: Joi.optional(), otherwise: Joi.required()})
});

describe('Validator usersJoiSchema checks', () => {

    it('It should save new user without id', () => {
        const result = Joi.validate({
            firstName: "Hello",
            lastName: "World",
            email: "[email protected]",
            password: "123456"
        }, usersJoiSchema, {abortEarly: false});
        expect(result.error).to.null();
        expect(result.error).to.not.exist();
    });

    it('It should update user without password field when id included', () => {
        const result = Joi.validate({
            _id: "some-id-string-here",
            firstName: "Hello",
            lastName: "World",
            email: "[email protected]",
        }, usersJoiSchema, {abortEarly: false});
        expect(result.error).to.null();
        expect(result.error).to.not.exist();
    });


    it('It should fail when id is empty and no password provided', () => {
        const result = Joi.validate({
            firstName: "Hello",
            lastName: "World",
            email: "[email protected]",
        }, usersJoiSchema, {abortEarly: false});
        expect(result.error).to.not.null();
        expect(result.error).to.exist();
    });
    it('It should fail when id is empty and password is also empty', () => {
        const result = Joi.validate({
            firstName: "Hello",
            lastName: "World",
            email: "[email protected]",
            password: "",
        }, usersJoiSchema, {abortEarly: false});
        expect(result.error).to.not.null();
        expect(result.error).to.exist();
    });
});

Вот тестовая команда

> lab --coverage-exclude test/data -m 5000n -a code -P "simple" "test/validators"

  ....

4 tests complete
Test duration: 8 ms
Assertions count: 8 (verbosity: 2.00)
No global variable leaks detected
person metoikos    schedule 10.01.2019
comment
Спасибо за ответ. Я до сих пор не понимаю, почему это дает мне ошибку 500. Я использую ту же схему. И нет никакой логики, связанной с проверкой схемы в маршрутах или контроллерах. - person Rajeshwar; 11.01.2019

  _id: Joi.string(),
  password: Joi.string().when("_id", {
     is: Joi.exist(),
     then: Joi.required()
  })

С указанным выше Joi будет гарантировать, что пароль требуется всякий раз, когда существует _id.

person Princewill Iroka    schedule 23.01.2020
comment
Благодарность! у меня сработало! - person chriszichrisz; 23.12.2020