Sails.js中的唯一属性失败

以下代码表示Sails.js v0.9.4中的帐户模型。

module.exports = { attributes: { email: { type: 'email', unique: true, required: true }, password:{ type: 'string', minLength: 6, maxLength: 15, required:true } } }; 

当我通过Postman向localhost:8080 / account发送两个POSTS和一个PUT请求时,电子邮件的唯一属性失败。 具体来说,我发送邮件的以下HTTP请求:

 POST http://localhost:8080/account?email=foo@gmail.com&password=123456 POST http://localhost:8080/account?email=bar@gmail.com&password=123456 PUT http://localhost:8080/account?id=1&email=bar@gmail.com GET http://localhost:8080/account 

最后的GET请求显示了我:

 [ { "email": "bar@gmail.com", "password": "123456", "createdAt": "2013-09-30T18:33:00.415Z", "updatedAt": "2013-09-30T18:34:35.349Z", "id": 1 }, { "email": "bar@gmail.com", "password": "123456", "createdAt": "2013-09-30T18:33:44.402Z", "updatedAt": "2013-09-30T18:33:44.402Z", "id": 2 } ] 

这是否应该发生?
*对于那些不知道的人, Waterline默认生成一个id,在每次插入时都会自动递增。

这是因为您的模式未在磁盘数据库中更新(“.tmp / disk.db”)。

您需要closures帆,放下您的数据库并重新启动帆。 数据库将重build与您的好架构。

注意:数据也会下降!

如果你想保留你的数据,你可以只更新“.tmp / disk.db”的模式部分。

我所做的是通过sails.js保存数据和重build模式:

  1. 复制“.tmp / disk.db”
  2. 干净“.tmp / disk.db”
  3. closuressails.js
  4. 启动sails.js – >数据库是空的,架构更新
  5. 复制旧的“计数器”部分
  6. 复制旧的“数据”部分

您必须在架构(文件“.tmp / disk.db” – >“架构”部分)中包含唯一字段:

  "xxx": { "type": "string", "unique": true }, 

我希望这可以帮助你。

我遇到了同样的问题。 要解决这个问题,你必须避免使用'磁盘'ORM适配器。 出于某种原因,它似乎不支持唯一性检查。

其他适配器如mongo和mysql应该支持唯一性检查,所以这不应该成为开发之外的问题。

在开发过程中,将config/adapters.js的默认config/adapters.js从“disk”更改为“memory”。 应该是这样的:

 module.exports.adapters = { // If you leave the adapter config unspecified // in a model definition, 'default' will be used. 'default': 'memory', // In-memory adapter for DEVELOPMENT ONLY memory: { module: 'sails-memory' }, ... }; 

我不确定这是否是问题,但是您是否已经为您的模型和适配器添加了schema:true

我的mongo适配器configuration如下所示:

  module.exports.adapters = { 'default': 'mongo', mongo: { module: 'sails-mongo', url: process.env.DB_URL, schema: true } }; 

而我的用户模型看起来像这样(修剪了一下):

  module.exports = { schema: true, attributes: { username: { type: 'string', required: true, unique: true } //... } }; 
 var InvoiceSchema = new Schema({ email: {type: 'email', required: true} name : {type: String} }); InvoiceScheme({email: 1}, {unique: true}); 

在Nodejs中设置Uniquee

没有必要删除当前的数据库来解决这个问题,而是将水线migrate选项从safe改为alter 。 这样底层的数据库将适应这个设置。

不过,我不build议在生产环境中migrate: alter 。 ;)


这是我的/config/local.js

 module.exports = { ... models: { migrate: 'alter' }, } 

根据帆的官方文件

您应该在“alter”中configuration选项“migrate”以创build具有其索引的模式

随着应用程序的发展,从模型中添加或删除validation没有任何问题。 但是一旦你投入生产,就有一个非常重要的例外:独特的。 在开发过程中,当您的应用程序configuration为使用migrate:“alter”时,您可以随意添加或删除独特的validation。 但是,如果您正在使用migrate:safe(例如,用您的生产数据库),则需要更新数据库中的约束/索引,以及手动迁移数据。

http://sailsjs.com/documentation/concepts/models-and-orm/validations