Уникальное свойство не работает в 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
}
}
};
Когда я отправляю два POSTS и запрос PUT через Postman на localhost: 8080/account, уникальное свойство электронной почты не срабатывает.
В частности, я отправляю следующие HTTP-запросы от Postman:
POST http://localhost:8080/[email protected]&password=123456
POST http://localhost:8080/[email protected]&password=123456
PUT http://localhost:8080/account?id=1&[email protected]
GET http://localhost:8080/account
Последний запрос GET показывает мне:
[
{
"email": "[email protected]",
"password": "123456",
"createdAt": "2013-09-30T18:33:00.415Z",
"updatedAt": "2013-09-30T18:34:35.349Z",
"id": 1
},
{
"email": "[email protected]",
"password": "123456",
"createdAt": "2013-09-30T18:33:44.402Z",
"updatedAt": "2013-09-30T18:33:44.402Z",
"id": 2
}
]
Если это произойдет?
* Для тех, кто не знает, Waterline генерирует по умолчанию идентификатор, который автоматически увеличивается при каждой вставке.
Ответы
Ответ 1
Это связано с тем, что ваша схема не обновляется в базе данных вашего диска ( ".tmp/disk.db" ).
Вам нужно отключить паруса, сбросить базу данных и перезапустить паруса.
БД будет восстановлена с помощью вашей хорошей схемы.
Внимание: данные также будут падать!
Если вы хотите сохранить свои данные, вы можете просто обновить часть схемы ".tmp/disk.db" .
Что я делаю, чтобы хранить данные и восстанавливать схему с помощью sails.js:
- copy ".tmp/disk.db"
- clean ".tmp/disk.db"
- shutdown sails.js
- начать sails.js
- > база данных пуста и обновлена схема.
- скопировать старую часть счетчиков
- скопировать старую часть данных "
Вы должны иметь это в своей схеме (файл ".tmp/disk.db" → "schema" ) для уникального поля:
"xxx": {
"type": "string",
"unique": true
},
Надеюсь, это поможет вам.
Ответ 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'
},
...
};
Ответ 3
Я не уверен, что это проблема, но добавили ли вы schema:true
к своим моделям и адаптерам?
Моя конфигурация адаптера mongo выглядит следующим образом:
module.exports.adapters = {
'default': 'mongo',
mongo: {
module: 'sails-mongo',
url: process.env.DB_URL,
schema: true
}
};
И моя модель User выглядит так (немного обрезана):
module.exports = {
schema: true,
attributes: {
username: {
type: 'string',
required: true,
unique: true
}
//...
}
};
Ответ 4
var InvoiceSchema = new Schema({
email: {type: 'email', required: true}
name : {type: String}
});
InvoiceScheme({email: 1}, {unique: true});
Установить Uniquee в Nodejs
Ответ 5
Нет необходимости удалять текущую базу данных, чтобы решить эту проблему, вместо параметра ватерлинии migrate
от safe
до alter
. Таким образом базовая база данных будет адаптировать этот параметр.
Я бы не рекомендовал migrate: alter
в рабочей среде.;)
Вот мой /config/local.js
:
module.exports = {
...
models: {
migrate: 'alter'
},
}
Ответ 6
Согласно официальной документации парусов
Вы должны настроить параметр "migrate" в "alter", чтобы создать схемы с их индексами
Нет ничего плохого в добавлении или удалении валидаций с вашего как ваше приложение развивается. Но как только вы идете на производство, одно очень важное исключение: уникальное. Во время разработки, когда приложение настроено на использование migrate: 'alter', вы можете добавить или удалить уникальные проверки по желанию. Однако, если вы используете migrate: safe (например, с вашей производственной базой данных), вы хотите обновить ограничений/индексов в вашей базе данных, а также рука.
http://sailsjs.com/documentation/concepts/models-and-orm/validations