node js回调函数有时会被忽略

时间:2017-12-22 12:15:57

标签: javascript node.js postgresql

您好我是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()方法中,但是不允许这样做。 如果一个人成功,另一个人也应该成功。如果其中一个失败,另一个也不能执行。

如何让这两个查询始终在一起工作?

1 个答案:

答案 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);
    });
})