2015-07-13 6 views
12

JS Anfänger versucht, eine PostgreSQL DB zu bekommen, die mit express.js durch bookshelf.js spricht.bookshelf js save() Befehl aktualisiert keine Zeilen in 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 scheint nicht in der Lage, jeden Inhalt an die DB hinzuzufügen.

Aktuelle Fehlermeldung lautet: „Unbehandelte Ablehnung Custom: Nein Aktualisiert Zeilen‘

Antwort

34

wenn Sie Ihr Modell der Bereitstellung Ihre eigene ID, wie

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

erstellen

Bookshelf nimmt an, es ist ein Update Betrieb, nicht eine Einfügung. Er setzt das interne isNew-Attribut auf false, und wenn save() aufgerufen wird, wird INSERT INTO user(id, ...) VALUES (2, ...);UPDATE user ... WHERE id = 2; ausgeführt.

Wenn kein Benutzer mit id = 2 ist das Update fastleise nichts tun.

Um einen Einsatz zwingen Sie die save() geändert werden muss:

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

Bibliothek speichern() documentation beschreibt dieses Verhalten.

+1

das hatte mich für ein bisschen, ich benutzte '{insert: true}' – kkemple

0

Haben erstellen Sie eine Benutzertabelle Knex mit Ein mögliches Problem, das ich denken kann, ist, dass Sie keine Logik haben, dass die tatsächlich schafft Tabelle für Postgres DB. Hier ist ein Beispielcode, der eine Tabelle in Ihrer Datenbank erstellen, wenn es noch nicht existiert.

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

ich Ihren Code versucht, aber ich habe den gleichen Fehler. Ich hatte ursprünglich eine einfachere Version dieses Codes, und ich habe auch versucht, die Tabelle manuell zu erstellen, die alle die gleiche Fehlermeldung zurückgeben. Könnte es Fehler in meinem PG-Setup geben? Ich habe alles einfach gehalten. –

-5

Nein nein! neuer Benutzer gibt ein VERSPRECHEN zurück! Du kannst es nicht so benutzen. Versuchen

new User().save() 
+0

Nicht wahr. 'new User' instanziiert das Modell nur im Speicher. Der Aufruf von 'save' * gibt * ein Versprechen zurück. Das Problem des OP bestand darin, einen Primärschlüssel anzugeben, der Bookshelf anweist, eine Aktualisierung statt einer Einfügung durchzuführen. –

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

Wenn das Attribut 'id' überschrieben wird (vorausgesetzt, es handelt sich um einen Primärschlüssel), versucht Bookshelf, anstelle einer Einfügung ein Update durchzuführen. Dies führt zu einem Fehler, wenn kein Datensatz mit dieser ID vorhanden ist. –

+0

Entschuldigung, ich dachte, er wollte nur Daten speichern. Ich habe gerade versucht zu demonstrieren, um Daten zu speichern, die nicht aktualisiert werden. Danke, dass du es aufgezeigt hast, sonst kann es andere fehlleiten. – n00b

+0

Ich werde den Code bearbeiten. – n00b