Незабавният отговор на въпроса ви е да използвате съхранена процедура, за да направите upsert.
Нещо подобно работи добре с pg модула.
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
});
Разбира се, това предполага, че използвате някакъв модел на обект, който има всички стойности, от които се нуждаете, дори ако те не се променят. Трябва да ги прехвърлите всички в upsert. Ако сте останали да го правите по начина, който сте показали тук, вероятно трябва да проверите действителния обект за грешка след актуализацията, за да определите дали е неуспешна, защото редът вече е там, или по някаква друга причина (което е истинска db грешка, която трябва да се обработи).
След това трябва да се справите с потенциалното състояние на състезание между момента, в който актуализацията ви е неуспешна, и времето, през което преминава вашето вмъкване. Ако друга функция се опита да вмъкне със същия идентификатор, имате проблем. Транзакциите са добри за това. Това е всичко, което имам в момента. Надявам се да помогне.