为什么 Mongoose 验证在 Keystone.js 应用程序中不起作用?
Why Mongoose validation isn't working in Keystone.js app?
是否对 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();
});
});
});
});
因此,前两个单元测试通过了正面测试,但后两个单元测试未通过。为什么验证不起作用?
因为validate
方法不是keystone方法,而是mongoose提供的方法。而且 mongoose 的验证比 keystone 更有限。
required: true
选项被传递给 mongoose 模式,这就是当您试图将必填字段留空时它会抛出的原因。
validate
没有真正的 keystone 等价物,但每当您尝试保存文档时,(mongoose+keystone) 验证都会 运行。
P.s。意识到它与Keystone版本无关
已经太晚了
是否对 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();
});
});
});
});
因此,前两个单元测试通过了正面测试,但后两个单元测试未通过。为什么验证不起作用?
因为validate
方法不是keystone方法,而是mongoose提供的方法。而且 mongoose 的验证比 keystone 更有限。
required: true
选项被传递给 mongoose 模式,这就是当您试图将必填字段留空时它会抛出的原因。
validate
没有真正的 keystone 等价物,但每当您尝试保存文档时,(mongoose+keystone) 验证都会 运行。
P.s。意识到它与Keystone版本无关
已经太晚了