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模式:
- 复制“.tmp / disk.db”
- 干净“.tmp / disk.db”
- closuressails.js
- 启动sails.js – >数据库是空的,架构更新
- 复制旧的“计数器”部分
- 复制旧的“数据”部分
您必须在架构(文件“.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