2017-02-08 2 views
1

Ich habe ein Skript, das ich auf einer geplanten Basis in Knoten ausführen möchte. Das Skript beendet und beendet nicht. Ich vermute, dass dies daran liegt, dass mein Datenbank-Client noch offen ist.Schließen postgres (pg) Client-Verbindung in node.js

Wenn ich Folgendes einschließe, wird die Clientverbindung geschlossen, bevor die Updates eine Zeit zum Auslösen haben.

query.on('end', function() { 
    client.end(); 
}); 

Ich kann nicht setTimeout oder diesen Mechanismus verwenden, weil ich nicht weiß, wie lange zu warten, bis die registerBundle Funktion abzuschließen. Auch ich denke, query.on (‚Ende‘ wird ausgelöst, wenn das Update abgeschlossen ist. Nicht sicher, wie dies zu testen.

Meine Frage, ich Dinge brauchen, um zu schießen.

  • Abfrage DB
  • Prozess jede Reihe (query.on
  • aktualisieren jede Zeile mit dem Wert von registerBundle zurück
  • Schließen db Client/Verbindung, wenn alle Zeilen verarbeitet worden sind.
  • Terminate Skript und Ausgangsknoten

Scheint ziemlich einfach aus einer Python/PHP-Welt, aber zerfällt in meiner Javascript-Welt.

Antwort

1

Ein Versprechen-basierte Schnittstelle wie pg-promise ist der Weg zu gehen:

var bluebird = require('bluebird'); 
var pgp = require('pg-promise')({ 
    promiseLib: bluebird 
}); 
var db = pgp(/*connection details*/); 

db.tx(t => { 
    // BEGIN executed 
    return t.map('SELECT id, chain FROM mytable where state_ready = $1 and transaction_id = $2', [true, 123], a => { 
     var chain = data.chain; 
     var pg_record = data.id; 
     return t.none('UPDATE mytable SET transaction_id = $1::text where id=$2::int', [transactionHash, pg_record]); 
    }).then(t.batch); // settling all internal queries 
}) 
    .then(data => { 
     // success, COMMIT executed 
    }) 
    .catch(error => { 
     // error, ROLLBACK executed 
    }) 
    .finally(pgp.end); // shuts down the connection pool 

Das obige Beispiel ist genau das, was Sie gefragt, und es verwendet eine Transaktion. Aber in Wirklichkeit werden Sie aus Performancegründen alles in einer Abfrage machen wollen;)

Siehe more examples.

+0

Irgendwo zwischen dem SELECT und UPDATE muss ich eine JavaScript-Funktion aufrufen, um die Werte zu erhalten, die ich für das Update benötige. Kann ich die Funktion direkt nach var pg_record aufrufen? –

+0

@DavidAaronMcInnis Natürlich kannst du! :) –

+0

Wenn ich versuche, dies auszuführen, erhalte ich einen Fehler "ReferenceError: data is not defined". Um das zu schaffen, musste ich "a => {" in "function (data) {" {funktion (daten) {") ändern. Nicht sicher, das ist richtig. –

Verwandte Themen