【问题标题】:Why Mongoose validation isn't working in Keystone.js app?为什么 Mongoose 验证在 Keystone.js 应用程序中不起作用?
【发布时间】:2017-05-04 19:19:45
【问题描述】:

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: 'test@test.com',
    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();
       });
    });
  });
});

所以前两个单元测试通过了正面,但最后两个没有。为什么验证不起作用?

【问题讨论】:

  • 哪个 Keystone 版本?
  • @Creynders 4.0.0- beta5

标签: node.js mongodb express mongoose keystonejs


【解决方案1】:

这是因为validate 方法不是一种基石方法,而是猫鼬提供的一种方法。 mongoose 的验证远比 keystone 有限。 required: true 选项被传递给猫鼬模式,这就是当您尝试将必填字段留空时它抛出的原因。 validate 没有真正的 keystone 等效项,但 (mongoose+keystone) 验证将在您尝试保存文档时运行。

附:发现和Keystone版本无关

【讨论】:

  • 非常感谢您的回答!我刚刚发现,没有验证电子邮件字段的方法,所以我假设使用 keystone 电子邮件类型而不是 String 的原因并不明显。为了完成您的答案,我只想补充一点,可以在猫鼬模型中定义电子邮件字段的验证方法
  • @VadimShvetsov Keystone 对电子邮件字段进行一些额外的验证,但仅在您保存它们时。如果您将它们保存在管理 UI 中,它会自动运行。但是,如果您直接使用文档,则需要使用 List.updateItem (v4) 或 updateHandler (v0.3) 才能从额外的验证中受益
  • 非常感谢,这绝对是一个完整的答案!
  • 顺便说一句,我意识到 keystone 类型 Name 不是验证必填字段,因为它的 props first 和 last 在名称类型定义中不是必需的。
猜你喜欢
  • 2020-06-30
  • 2017-07-03
  • 2021-03-09
  • 2016-09-11
  • 2017-02-01
  • 2013-05-27
  • 2018-11-26
  • 2014-07-03
  • 1970-01-01
相关资源
最近更新 更多