Ошибка уникального свойства в 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 по умолчанию генерирует идентификатор, который автоматически увеличивается при каждой вставке.


person georgez    schedule 30.09.2013    source источник
comment
Я мог бы преодолеть это ошибочное поведение, установив autoPK:false.   -  person georgez    schedule 30.09.2013
comment
Когда я установил для своего autoPK значение false, мой столбец id был удален.   -  person Jimmie Johansson    schedule 14.12.2013


Ответы (6)


Это связано с тем, что ваша схема не обновляется в вашей дисковой базе данных (".tmp/disk.db").

Вам нужно выключить паруса, сбросить БД и перезапустить паруса. БД будет реконструирована с вашей хорошей схемой.

Внимание: данные тоже будут удалены!

Если вы хотите сохранить свои данные, вы можете просто обновить часть схемы «.tmp/disk.db».

Что я делаю, чтобы сохранить данные и перестроить схему с помощью Sails.js:

  1. скопировать ".tmp/disk.db"
  2. очистить ".tmp/disk.db"
  3. выключение Sailes.js
  4. запустите паруса.js -> база данных пуста, а схема обновлена
  5. скопировать старую часть "счетчиков"
  6. скопировать старую часть "данные"

Вы должны иметь это в своей схеме (файл «.tmp/disk.db» -> «схема») для уникального поля:

  "xxx": {
    "type": "string",
    "unique": true
  },

Я надеюсь, что это поможет вам.

person yoh    schedule 06.06.2014
comment
Лучшее решение — попросить Waterline обновить схему базы данных. См. настройку migrate и убедитесь, что она установлена ​​на alter (models.migrate = 'alter') - person qualbeen; 10.03.2017

Я столкнулся с этой же проблемой. Чтобы решить эту проблему, вы должны избегать использования «дискового» адаптера 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'
  },

  ...
};
person sethetter    schedule 01.10.2013
comment
Я забыл упомянуть, что я пробовал адаптеры «диск» и «память», прежде чем опубликовать свою проблему в stackoverflow. Однако не пробовал базу данных. - person georgez; 01.10.2013
comment
Вы пробовали это в сочетании с autoPK: правда? - person sethetter; 02.10.2013
comment
Да, я это сделал. Если вы заметили, что мои POST-запросы не требуют идентификатора (это означает, что он включен, то есть autoPK:true). - person georgez; 02.10.2013
comment
Как для вас выглядит config/adapters.js? - person sethetter; 03.10.2013
comment
По умолчанию (тот, что появляется при его создании командой sails) config/adapters.js с 'default': 'memory' - person georgez; 03.10.2013
comment
Кажется, это не исправлено для локальных дисков на парусах 0.10.x Для парусов-памяти у меня работает хорошо. Спасибо. - person A-letubby; 12.05.2014

Я не уверен, что это проблема, но добавили ли вы schema:true в свои модели и адаптеры?

Конфигурация моего адаптера монго выглядит так:

    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
                    }
                    //...
            }
    };
person Jooky    schedule 02.10.2013
comment
Я не думаю, что свойство schema имеет значение, когда свойство default равно disk или memory. Мой вывод основан на документации по модели Sails. Из любопытства я попробовал default:memory и default:disk с schema:true. Это не сработало. :( А пока я просто переключусь на MongoDB и продолжу свою работу оттуда. - person georgez; 03.10.2013

Нет необходимости удалять текущую базу данных, чтобы решить эту проблему, вместо этого измените параметр ватерлинии migrate с safe на alter. Таким образом, базовая база данных адаптирует этот параметр.

Однако я бы не рекомендовал migrate: alter в производственной среде. ;)


Вот мой /config/local.js:

module.exports = {

    ... 

    models: {
        migrate: 'alter'
    },
}
person qualbeen    schedule 10.03.2017

По официальной документации парусов

Вы должны настроить опцию «мигрировать» в «изменить», чтобы создать схемы с их индексами.

Нет ничего плохого в добавлении или удалении проверок из ваших моделей по мере развития вашего приложения. Но как только вы переходите к производству, есть одно очень важное исключение: уникальный. Во время разработки, когда ваше приложение настроено на использование migrate: 'alter', вы можете добавлять или удалять уникальные проверки по своему желанию. Однако, если вы используете migrate: safe (например, с вашей производственной базой данных), вы захотите обновить ограничения/индексы в своей базе данных, а также перенести свои данные вручную.

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

person Juan Francisco Maldonado León    schedule 23.08.2017

var InvoiceSchema = new Schema({
 email: {type: 'email', required: true}
  name : {type: String}
});
InvoiceScheme({email: 1}, {unique: true});

Установить уникальность в Nodejs

person vinodh    schedule 12.11.2015