Уникальное свойство не работает в 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