2013-09-30 13 views
12

Poniższy kod reprezentuje model konta w pliku Sails.js v0.9.4.Niepowodzenie unikalnej właściwości w pliku Sails.js

module.exports = { 

     attributes: { 
     email: { 
      type: 'email', 
      unique: true, 
      required: true 
     }, 
     password:{ 
      type: 'string', 
      minLength: 6, 
      maxLength: 15, 
      required:true 
     } 
     } 

    }; 

Kiedy wysłać dwa stanowiska i żądania PUT poprzez Postman do localhost: 8080/konto, unikalna własność e-mail nie powiedzie się. Konkretnie mogę wysłać następujące żądania HTTP z 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 

Ostatnia prośba GET pokazuje mi:

[ 
    { 
    "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 
    } 
] 

Gdyby tak się stało?
* Dla tych, którzy nie wiedzą, Waterline generuje domyślnie identyfikator, który automatycznie zwiększa się w każdym wstawieniu.

+0

mogłem przezwyciężyć ten "wadliwy" zachowanie przez ustawienie 'autoPK: FALSE. – george

+0

Po ustawieniu opcji autoPK na wartość false moja kolumna id została usunięta. –

Odpowiedz

10

To dlatego, że schemat nie jest aktualizowany na dysku baza danych (".tmp/disk.db").

Musisz zamknąć żagle, upuść bazę danych i ponownie uruchom żagle. DB zostanie zrekonstruowany z dobrym schematem.

Uwaga: dane również zostaną upuszczone!

Jeśli chcesz zachować swoje dane, możesz po prostu zaktualizować część schematu ".tmp/disk.db".

Co mam robić, aby zachować dane i odbudować schemat przez sails.js:

  1. Kopiuj ".tmp/disk.db"
  2. czysty ".tmp/disk.db"
  3. z zamykaniem sails.js
  4. rozpocząć sails.js -> baza danych jest pusta, a schemat jest aktualizowany
  5. skopiować stare „liczniki” część
  6. skopiować stare „dane” część

Musisz mieć to w swoim schemacie (plik ".tmp/disk.db”-> "schema część") dla wyjątkowej dziedzinie.

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

Mam nadzieję, że to pomoże Ci

+0

Lepszym rozwiązaniem jest powiadomienie Waterline o aktualizacji schematu db Zobacz ustawienie 'migrate' i upewnij się, że jest ustawione na'. alter' ('models.migrate = 'alter'') – qualbeen

6

Wpadłem na ten sam problem. Aby go rozwiązać, należy unikać używania adaptera ORM "dysku". Z jakiegoś powodu wydaje się, że nie obsługuje sprawdzania unikalności.

Inne adaptery, takie jak mongo i mysql, powinny obsługiwać sprawdzanie niepowtarzalności, więc nie powinno to stanowić problemu poza opracowaniem.

W trakcie opracowywania zmień domyślny adapter w config/adapters.js z "dysku" na "pamięć". Powinien wyglądać następująco:

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' 
    }, 

    ... 
}; 
+0

Zapomniałem wspomnieć, że wypróbowałem adaptery "dysku" i "pamięci" przed opublikowaniem mojego problemu na stackoverflow. Nie próbowałem jednak bazy danych. – george

+0

Czy wypróbowałeś to w połączeniu z autoPK: prawda? – sethetter

+0

Tak, zrobiłem. Jeśli zauważysz, że moje żądania POST nie wymagają identyfikatora (oznacza to, że jest włączony, tj. 'AutoPK: true'). – george

1

Nie jestem pewien, jest to problem, ale masz dodany schema:true do swoich modeli i kart?

Mój adapter Mongo config wygląda następująco:

module.exports.adapters = { 
      'default': 'mongo', 
      mongo: { 
        module: 'sails-mongo', 
        url: process.env.DB_URL, 
        schema: true 
      } 
    }; 

A mój model Użytkownik wygląda następująco (przycięta trochę):

module.exports = { 
      schema: true, 
      attributes: { 
        username: { 
          type: 'string', 
          required: true, 
          unique: true 
        } 
        //... 
      } 
    }; 
+0

Nie sądzę, że właściwość 'schema' ma znaczenie, gdy właściwością' default' jest 'disk' lub' memory'. Mój wniosek opiera się na [dokumentacji modelu Sails] (http://sailsjs.org/#!documentation/models). Z ciekawości podałem 'default: memory' i' default: disk' z 'schema: true' a go. To nie zadziałało. :( W międzyczasie przełączyłem się na MongoDB i kontynuowałem pracę stamtąd – george

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

Set Uniquee W Nodejs

0

Nie ma potrzeby aby usunąć bieżącą bazę danych, aby rozwiązać ten problem, zamiast zmienić opcję linii wodnej migrate z safe na alter. W ten sposób bazowa baza danych dostosuje to ustawienie:

Nie polecam jednak migrate: alter w środowisku produkcyjnym. ;)


Oto mój /config/local.js:

module.exports = { 

    ... 

    models: { 
     migrate: 'alter' 
    }, 
} 
0

Według oficjalnej dokumentacji żagle

należy skonfigurować opcję „migracji” w „alter” do tworzenia schematów z ich indeksy

Nie ma nic złego w dodawaniu lub usuwaniu sprawdzania poprawności z Twojego modeli w miarę ewolucji aplikacji. Ale kiedy idziesz do produkcji, jest jeden bardzo ważny wyjątek: unikalny. Podczas programowania, gdy Twoja aplikacja jest skonfigurowana do używania migracji: "zmień", możesz dowolnie dodawać lub usuwać unikalne, niepowtarzalne weryfikacje. Jeśli jednak używasz migracji: bezpieczne (np. Z produkcyjną bazą danych), będziesz chciał zaktualizować ograniczenia/indeksy w bazie danych, a także zmigrować swoje dane ręcznie o .

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

Powiązane problemy