Die unmittelbare Antwort auf Ihre Frage ist, eine gespeicherte Prozedur zu verwenden, um ein Upsert durchzuführen.
So etwas funktioniert gut mit dem pg-Modul.
client.query({
text: "SELECT upsert($1, $2, $3, $4, $5, $6)"
values: [ obj.id,
obj.first_name,
obj.last_name,
1,
ip,
date_now.getFullYear() + "-" + month + "-" + date_now.getDate() + " " + date_now.getHours() + ":" + date_now.getMinutes() + ":" + date_now.getSeconds()
]
}, function(u_err, u_result){
if(err) // this is a real error, handle it
// otherwise your data is updated or inserted properly
});
Dies setzt natürlich voraus, dass Sie eine Art Modellobjekt verwenden, das alle benötigten Werte enthält, auch wenn sie sich nicht ändern. Sie müssen sie alle in den Upsert übergeben. Wenn Sie nicht weiterkommen, wie Sie es hier gezeigt haben, sollten Sie wahrscheinlich das eigentliche Fehlerobjekt nach der Aktualisierung überprüfen, um festzustellen, ob es fehlgeschlagen ist, weil die Zeile bereits vorhanden ist, oder aus einem anderen Grund (was ein echter DB-Fehler ist, der behandelt werden muss).
Dann müssen Sie sich mit der potenziellen Race-Bedingung zwischen dem Fehlschlagen Ihres Updates und dem Durchlaufen Ihrer Einfügung auseinandersetzen. Wenn eine andere Funktion versucht, mit derselben ID einzufügen, haben Sie ein Problem. Transaktionen sind dafür gut. Das ist alles, was ich gerade habe. Hoffe es hilft.