2015-07-13 11 views
12

JS początkujący próbuje uzyskać PostgreSQL DB rozmowę z express.js poprzez bookshelf.js.regał js polecenie save() nie aktualizuje wierszy w postgresql db

github: https://github.com/duskyshelf/bookers-academy/blob/master/booker.js

var knex = require('knex')({ 
    client: 'pg', 
    connection: "postgres://localhost/bookers" 
}); 

var bookshelf = require('bookshelf')(knex); 

var User = bookshelf.Model.extend({ 
    tableName: 'users' 
}); 

var bob = new User({id: 2}); 
bob.save() 

bookshelf.js wydaje stanie dodać dowolną zawartość do db.

Aktualny komunikat o błędzie: „Unhandled odrzucenie CustomErrors: Brak Wiersze Zaktualizowane”

Odpowiedz

34

Podczas tworzenia modelu zapewniając własny identyfikator, jak w

var bob = new User({id: 2}); 

Regał przyjmuje, że jest to wstawienie, ponieważ jest to, , a nie . Ustawia wewnętrzny atrybut isNew na wartość false, a po wywołaniu save() zamiast INSERT INTO user(id, ...) VALUES (2, ...); wykonuje on UPDATE user ... WHERE id = 2;.

Jeśli użytkownik nie ma z id = 2 aktualizacja zostanie prawie cicho zrobić nic.

Aby wymusić wkładkę trzeba zmienić save() do:

bob.save(null, {method: 'insert'}); 

Bookshelf save() documentation opisuje ten problem.

+1

to miało mnie na trochę, użyłem '{insert: true}' – kkemple

0

Czy utworzyć tabelę użytkownika za pomocą knex Potencjalnym problemem mogę myśleć, że nie ma żadnej logiki, które faktycznie tworzy stół dla PostgreSQL DB. Oto przykładowy kod, który będzie utworzyć tabelę w bazie danych, jeśli jeszcze nie istnieje.

bookshelf.knex.schema.hasTable('User').then(function(exists) { 
    if(!exists) { 
    bookshelf.knex.schema.createTable('User'), function(user) { 
     user.increments('id').primary(); 
     user.timestamps(); 
    }).then(function(table){ 
     console.log('Created Table:', table); 
    }); 
    } 
}); 
+0

Próbowałem swój kod, ale pojawia się ten sam błąd. Początkowo miałem prostszą wersję tego kodu, a także próbowałem ręcznie utworzyć tabelę, z których wszystkie zwracają ten sam komunikat o błędzie. Czy mogą występować jakieś błędy w konfiguracji PG? Zachowałem wszystko domyślnie dla prostoty. –

-5

Nie, nie! nowy Użytkownik zwraca PROMISE! Nie możesz tego tak użyć. Spróbuj

new User().save() 
+0

Nie prawda. 'new User' tylko tworzy instancję modelu w pamięci. Wywołanie 'save' * does * zwróci Obietnicę. Problem związany z OP był określony klucz podstawowy, który zaleca regałowi do przeprowadzenia aktualizacji zamiast wstawiania. –

-1
new User({id: 2}). 
save(). 
then((model) => { 
    res.json({ success: true }); 
}); 
+0

Zastąpienie atrybutu "id" (zakładając, że jest to klucz podstawowy) spowoduje, że Bookshelf spróbuje aktualizacji zamiast wstawki. Spowoduje to zgłoszenie błędu, jeśli nie ma istniejącego rekordu z tym "identyfikatorem". –

+0

Przepraszam, myślałem, że próbował tylko zapisać dane. Po prostu próbowałem pokazać, że nie aktualizuję danych. dzięki za wskazanie, w przeciwnym razie może wprowadzić w błąd innych. – n00b

+0

Zamierzam edytować kod. – n00b

Powiązane problemy