Sails.js中的唯一属性失败

时间:2013-09-30 18:47:26

标签: node.js express sails.js waterline

以下代码表示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请求时,电子邮件的唯一属性失败。 具体来说,我从Postman发送以下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,该ID会在每次插入时自动递增。

6 个答案:

答案 0 :(得分:10)

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

您需要关闭风帆,丢弃数据库并重新启动风帆。 数据库将使用您的良好架构进行重建。

注意:数据也会下降!

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

我通过sails.js保存数据并重建架构:

  1. 复制“.tmp / disk.db”
  2. clean“.tmp / disk.db”
  3. shutdown sails.js
  4. 启动sails.js - >数据库为空并且架构已更新
  5. 复制旧“柜台”部分
  6. 复制旧“数据”部分
  7. 您必须在架构(文件“.tmp / disk.db” - >“架构”部分)中为此唯一字段设置此内容:

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

    我希望这对你有所帮助。

答案 1 :(得分:6)

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

其他适配器(如mongo和mysql)应该支持唯一性检查,因此这不应该是开发之外的问题。

对于开发过程,将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'
  },

  ...
};

答案 2 :(得分:1)

我不确定这是个问题,但您是否已将schema:true添加到模型和适配器中?

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

    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
                    }
                    //...
            }
    };

答案 3 :(得分:1)

根据帆的官方文件

您应该在“alter”中配置选项“migrate”以创建带有索引的模式

  

添加或删除您的验证没有任何问题   模特随着你的应用程序的发展。但是一旦你去生产,就有了   一个非常重要的例外:独特。在开发过程中,当你的   应用程序配置为使用migrate:'alter',您可以添加或删除   随意的独特验证。但是,如果您使用的是migrate:safe   (例如,使用您的生产数据库),您将需要更新   数据库中的约束/索引,以及迁移数据   手。

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

答案 4 :(得分:0)

var InvoiceSchema = new Schema({
 email: {type: 'email', required: true}
  name : {type: String}
});
InvoiceScheme({email: 1}, {unique: true});

Set Uniquee In Nodejs

答案 5 :(得分:0)

无需删除当前数据库来解决此问题,而是将水线migrate选项从safe更改为alter。这样底层数据库将适应此设置。

但我不建议在生产环境中使用migrate: alter。 ;)

这是我的/config/local.js

module.exports = {

    ... 

    models: {
        migrate: 'alter'
    },
}