2017-05-02 21 views
0

Keystone.jsの必須フィールド、電子メールフィールド、および名前フィールドの検証はありますか?なぜMongoose検証が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(); 

そして、ユニットテストのいくつかの並べ替え:

は、ここに私のユーザーの例のモデルです。エラーが投げていないので、最後の2つは失敗します。

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(); 
     }); 
    }); 
    }); 
}); 

だから、最初の二つのユニットテストは、正の合格が、最後の2されていません。なぜ検証がうまくいかないのですか?

+0

Keystoneのバージョンは? – Creynders

+0

@Creynders 4.0.0-beta5 –

答えて

1

validateメソッドはキーストーンメソッドではなく、マングースが提供するメソッドであるためです。そして、マングースはキーストーンよりはるかに限定された検証をしています。 required: trueオプションは、mongooseスキーマに渡されます。これは、必要なフィールドを空白のままにするときにスローされる理由です。 validateには実際のキーストーンはありませんが、ドキュメントを保存しようとすると(マングース+キーストーン)検証が実行されます。

p.s. Keystoneのバージョンとは何の関係もないことが遅すぎたことを認識しました

+0

お返事ありがとうございました!私はちょうど、電子メールフィールドの検証方法がないことを知りました。なぜ、Stringの代わりにkeystone email typeを使用するのかは明らかではありません。あなたの答えを完成させるために、私は追加するだけで、マングースモデルの電子メールフィールドの検証メソッドを定義することが可能です。 –

+0

@VadimShvetsov Keystone _does_電子メールフィールドのいくつかの追加検証を行います。これは管理UIに保存すると自動的に実行されます。しかし、ドキュメントを直接操作する場合は、List.updateItem(v4)またはupdateHandler(v0.3)を使用して追加検証の恩恵を受ける必要があります – Creynders

+0

ありがとうございます、これは間違いなく完全な答えです! –

関連する問題