Почему проверка Mongoose не работает в приложении Keystone.js?

Есть ли проверка обязательных полей, поля электронной почты и поля имени в Keystone.js?

Вот моя модель пользователя, например:

const keystone = require('keystone');
const Types = keystone.Field.Types;
const User = new keystone.List('User');

User.add({
  name: { type: Types.Name, required: true, initial: true, index: true },
  email: { type: Types.Email, required: true, initial: true, index: true, unique: true },
  password: { type: Types.Password, initial: true, required: true },
}, 'Permissions', {
  isAdmin: { type: Boolean, label: 'Can access Keystone', index: true },
});

// Provide access to Keystone
User.schema.virtual('canAccessKeystone').get(function () {
  return this.isAdmin;
});

User.defaultColumns = 'name, email, isAdmin';
User.register();

И какие-то юнит-тесты. Последние два терпят неудачу, потому что ошибка не выдается.

const User = keystone.list('User').model;

describe('User model', function () {
  const newUser = {
    name: {
      first: 'Test',
      last: 'Testov',
    },
    email: '[email protected]',
    password: 'test',
  };

  describe('validation', function () {
    it('should reject a new user without email', function (done) {
      const invalidUser = Object.assign({}, newUser);
      delete invalidUser.email;
      new User(invalidUser).validate((err) => {
        assert.equal('Path `email` is required.', err.errors.email.message);
        done();
      });
    });

    it('should reject a new user without password', function (done) {
      const invalidUser = Object.assign({}, newUser);
      delete invalidUser.password;
      new User(invalidUser).validate((err) => {
        assert.equal('Path `password` is required.', err.errors.password.message);
        done();
      });
    });

    it('should reject a new user with invalid email', function (done) {
      const invalidUser = Object.assign({}, newUser);
      invalidUser.email = 'roflrofl';
      new User(invalidUser).validate((err) => {
        console.log(err);
        assert.isOk(err);
        done();
      });
    });

    it('should reject a new user without name', function (done) {
      const invalidUser = Object.assign({}, newUser);
      invalidUser.name = { omg: 'wtf' };
      new User(invalidUser).validate((err) => {
        console.log(err);
        assert.isOk(err);
        done();
       });
    });
  });
});

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


person Vadim Shvetsov    schedule 02.05.2017    source источник
comment
какая версия Keystone?   -  person Creynders    schedule 04.05.2017
comment
@Creynders 4.0.0- бета5   -  person Vadim Shvetsov    schedule 04.05.2017


Ответы (1)


Это потому, что метод validate не является методом трапецеидального искажения, а тот, который предоставляет мангуст. И мангуст имеет гораздо более ограниченную проверку, чем краеугольный камень. Параметры required: true передаются схеме мангуста, поэтому она сбрасывает, когда вы пытаетесь оставить обязательное поле пустым. Для validate нет реального эквивалента трапецеидального искажения, но проверка (мангуст + трапецеидальный искажение) будет выполняться всякий раз, когда вы пытаетесь сохранить документ.

P.S. слишком поздно понял, что это не имеет ничего общего с версией Keystone

person Creynders    schedule 04.05.2017
comment
Большое спасибо за ответ! Я только что узнал, что не существует метода проверки поля электронной почты, поэтому не очевидно, почему я предполагаю использовать тип электронной почты keystone вместо String. Для завершения вашего ответа я просто хочу добавить, что можно определить метод проверки для поля электронной почты в модели мангуста. - person Vadim Shvetsov; 04.05.2017
comment
@VadimShvetsov Keystone делает дополнительную проверку полей электронной почты, но только при их сохранении. Это запускается автоматически, если вы сохраняете их в пользовательском интерфейсе администратора. Однако, если вы работаете с документами напрямую, вам нужно будет использовать List.updateItem (v4) или updateHandler (v0.3), чтобы воспользоваться дополнительной проверкой. - person Creynders; 04.05.2017
comment
Большое спасибо, это определенно полный ответ! - person Vadim Shvetsov; 04.05.2017
comment
Кстати, я понял, что имя типа трапецеидального искажения не проверяет обязательное поле, потому что реквизиты сначала и последний не требуются в определении типа имени. - person Vadim Shvetsov; 06.05.2017