【问题标题】:Unique property fails in Sails.jsSails.js 中的唯一属性失败
【发布时间】:2013-10-06 17:56:56
【问题描述】:

以下代码表示 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 发送两个 POST 和一个 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,它会在每次插入时自动递增。

【问题讨论】:

  • 我可以通过设置autoPK:false来克服这种“错误”行为。
  • 当我将我的 autoPK 设置为 false 时,我的 id 列被删除了。

标签: node.js express sails.js waterline


【解决方案1】:

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

您需要关闭sails,删除您的数据库并重新启动sails。 将使用您的良好架构重建数据库。

注意:数据也会掉!

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

我为保存数据和通过sails.js 重建架构所做的工作:

  1. 复制“.tmp/disk.db”
  2. 清理“.tmp/disk.db”
  3. 关闭sails.js
  4. 启动sails.js -> 数据库为空,模式已更新
  5. 复制旧的“计数器”部分
  6. 复制旧的“数据”部分

对于唯一字段,您必须在架构(文件“.tmp/disk.db”->“架构”部分)中有这个:

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

希望对你有所帮助。

【讨论】:

  • 更好的解决方案是告诉 Waterline 更新数据库模式。查看migrate 设置,并确保将其设置为alter (models.migrate = 'alter')
【解决方案2】:

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

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

在开发过程中,将config/adapters.js中的默认适配器从“磁盘”更改为“内存”。应该是这样的:

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'
  },

  ...
};

【讨论】:

  • 我忘了提到我在 stackoverflow 上发布我的问题之前尝试了“磁盘”和“内存”适配器。虽然没有尝试数据库。
  • 你试过结合 autoPK: true 吗?
  • 是的。如果您注意到我的 POST 请求不需要 id(这意味着它已启用,即autoPK:true)。
  • config/adapters.js 对你来说是什么样的?
  • 默认的(使用sails 命令创建的那个)config/adapters.js 和'default': 'memory'
【解决方案3】:

我不确定这是否是问题所在,但您是否已将 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
                    }
                    //...
            }
    };

【讨论】:

  • default 属性为diskmemory 时,我认为schema 属性并不重要。我的结论是基于Sails model documentation。出于好奇,我试了一下default:memorydefault:diskschema:true。它没有用。 :( 与此同时,我将切换到 MongoDB 并从那里继续我的工作。
【解决方案4】:

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

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


这是我的/config/local.js

module.exports = {

    ... 

    models: {
        migrate: 'alter'
    },
}

【讨论】:

    【解决方案5】:

    根据sails的官方文档

    您应该在“alter”中配置“迁移”选项以创建带有索引的架构

    添加或删除验证并没有错 随着您的应用程序的发展,模型。但是一旦你投入生产,就会有 一个非常重要的例外:独特。在开发过程中,当您的 应用配置为使用 migrate: 'alter',可以添加或删除 随意独特的验证。但是,如果您使用迁移:安全 (例如,使用您的生产数据库),您将需要更新 数据库中的约束/索引,以及通过以下方式迁移数据 手。

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

    【讨论】:

      【解决方案6】:
      var InvoiceSchema = new Schema({
       email: {type: 'email', required: true}
        name : {type: String}
      });
      InvoiceScheme({email: 1}, {unique: true});
      

      在Nodejs中设置唯一性

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-13
        相关资源
        最近更新 更多