Bookshelf.js在创build新logging之前进行独特的电子邮件validation

我试图validation电子邮件在创build新logging时已经在Bookshelf.js中存在validation。

我在这里find了一个解决schemegithub,但它不工作,即使我尝试与诺言

User = bookshelf.Model.extend({ tableName: 'users', initialize: function() { this.on('saving', this._assertEmailUnique); }, _assertEmailUnique: function(model, attributes, options) { if (this.hasChanged('email')) { return this .query('where', 'email', this.get('email')) .fetch(_.pick(options, 'transacting')) .then(function (existing) { if (!existing) throw new Error('duplicate email'); }); } } }); 

对于目前正在使用Joi的 Modelvalidation,看起来Joi也不支持对此进行自定义validation。 我正在使用Postgres数据库。 有任何其他的方式来做它..请帮助…

提前致谢..

你的代码有两个错误阻止它的工作:

  1. if (!existing) ...应该被颠倒,因为如果给定的电子邮件已经存在,你就会失败
  2. 查询this将限制您的查询到当前logging,您需要从头开始查询,使用普通User

有了这些修复程序,您的代码将如下所示:

 User = bookshelf.Model.extend({ tableName: 'users', initialize: function() { this.on('saving', this._assertEmailUnique); }, _assertEmailUnique: function(model, attributes, options) { if (this.hasChanged('email')) { return User .query('where', 'email', this.get('email')) .fetch(_.pick(options || {}, 'transacting')) .then(function(existing) { if (existing) { throw new Error('Duplicated email: User id #' + existing.id); } }); } } }); 
Interesting Posts