12

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

4

6 回答 6

10

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

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

注意:数据也会下降!

如果你想保留你的数据,你可以只更新“.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
  },

我希望这对你有帮助。

于 2014-06-06T15:10:41.503 回答
6

我遇到了同样的问题。要解决它,您必须避免使用“磁盘”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'
  },

  ...
};
于 2013-10-01T11:54:59.640 回答
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
                    }
                    //...
            }
    };
于 2013-10-02T21:32:09.260 回答
1

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

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


这是我的/config/local.js

module.exports = {

    ... 

    models: {
        migrate: 'alter'
    },
}
于 2017-03-10T11:13:49.683 回答
1

根据风帆的官方文件

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

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

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

于 2017-08-23T21:49:12.453 回答
0
var InvoiceSchema = new Schema({
 email: {type: 'email', required: true}
  name : {type: String}
});
InvoiceScheme({email: 1}, {unique: true});

在Nodejs中设置唯一性

于 2015-11-12T10:54:32.263 回答