最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 4浏览 0评论

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

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

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

回答如下:

您正在尝试在SQL中实现称为事务的事物。在Nodejs中,数据库查询是异步的。尝试使用query.on(“row”)和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);
    });
})

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

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

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

回答如下:

您正在尝试在SQL中实现称为事务的事物。在Nodejs中,数据库查询是异步的。尝试使用query.on(“row”)和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);
    });
})

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论