以下代码表示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会在每次插入时自动递增。
答案 0 :(得分:10)
这是因为您的架构未在磁盘数据库中更新(“.tmp / disk.db”)。
您需要关闭风帆,丢弃数据库并重新启动风帆。 数据库将使用您的良好架构进行重建。
注意:数据也会下降!
如果您想保留数据,可以只更新“.tmp / disk.db”的架构部分。
我通过sails.js保存数据并重建架构:
您必须在架构(文件“.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'
},
}