Node js回调函数有时被忽略



嗨,我是Node JS和PostgreSQL的新手,并尝试适应它。仍然我必须修改nodejs代码。

我定义了执行2 SQL的函数。插入和更新。我将更新语句放入插入的回调函数

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

};

更新的第二个查询主要运行良好,但有时无法执行。我尝试将两个语句放入同一Query()方法中,但不允许。如果一个成功,另一个也应该成功。如果其中一个失败,另一个也不能执行。

我如何使两个查询始终一起工作?

您正在尝试实现SQL中称为事务的东西。在nodejs中,数据库查询是异步的。尝试使用query.on("行")和query.on(" end")事件来处理此行为。给定的代码块将确保在调用回调之前运行第二个查询。有一种叫做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);
    });
})

最新更新