您好我是Node js和Postgresql的新手,并尝试习惯它。我仍然需要修改nodejs代码..
我定义了一个执行2个SQL的函数。插入和更新。 我把UPDATE语句放在INSERT的回调函数中,就像这样
exports.requestwithdraw = function(depositId, amount, uowner, uaccf, uid, sum, wdcnt, callback) {
query('INSERT INTO public.cash(mode, value, requested, step, uid, uname, uacc, id, stname) VALUES (2, $1, now(), 1, $5, $2, $3, $4, $6);', [amount, uowner, uaccf, depositId, uid, '신청'], function(err, res) {
if(err) return callback(err); // <--this INSERT always works.
assert(res.rowCount === 1);
query('UPDATE users set balance= $2,last_req=now() where id= $1', [uid,sum],function(err, res2) {
if(err) return callback(err); // <--this UPDATE sometimes doesn't work
assert(res2.rowCount === 1);
callback(null);
});
});
};
UPDATE的第二个查询大多运行良好,但有时无法执行。我尝试将两个语句放在同一个query()方法中,但是不允许这样做。 如果一个人成功,另一个人也应该成功。如果其中一个失败,另一个也不能执行。
如何让这两个查询始终在一起工作?
答案 0 :(得分:0)
您正在尝试在SQL中实现称为事务的事物。 在Nodejs中,数据库查询是异步的。 尝试使用query.on(&#34; row&#34;)和query.on(&#34; end&#34;)事件来处理此行为。 给定代码块将确保在调用回调之前运行第二个查询。 有一种叫做knex js的东西可以用来处理交易。
exports.requestwithdraw = function(depositId, amount, uowner, uaccf, uid, sum, wdcnt, callback) {
var query1 = query('INSERT INTO public.cash(mode, value, requested, step, uid, uname, uacc, id, stname) VALUES (2, $1, now(), 1, $5, $2, $3, $4, $6);', [amount, uowner, uaccf, depositId, uid, '신청'], function(err, res){
if(err) return callback(err);
assert(res.rowCount === 1);
});
query1.on('end', function(result){
query2 = query('UPDATE users set balance= $2,last_req=now() where id= $1', [uid,sum], function(err, res2){
if(err) return callback(err);
assert(res2.rowCount === 1);
});
query2.on('end' function(result2){
callback(null);
});
})