使用nodejs中的aysync在oracledb上进行同步查询

时间:2016-02-01 15:04:31

标签: javascript node.js oracle express node-async

我对nodejs很新。我正在使用oracledb并希望以同步顺序进行查询。因此,一旦执行第一个查询,则将在第二个查询中使用查询的输出。我看了async.waterfall并写下了代码。是以同步方式调用函数的正确方法吗?提前致谢。第一次查询可能比第二次查询花费更多时间。

var update = function(fnParam1, fnParam2){  
    oracledb.maxRows = 10000;   
oracledb.getConnection(
            {
            user          : dbConfig.user,
            password      : dbConfig.password,
            connectString : dbConfig.connectString
            },

function(err, connection)
            {
                if (err) { console.log(err.message); return; }
                async.waterfall([
                                 function(callback) {
                                     connection.execute("select column1 from table1 where param1 =:nm",[fnParam1], 
                                     function(err, result)
                                     {
                                        if (err) { console.log(err); return; }
                                            column1 = String(result.rows[0][0]);
                                     });
                                     callback(null, column1,connection);
                                 },
                                 function(column1, connection,callback) {
                                    connection.execute("select count(*) from table2 where column1 = :par1 and column2= :par2",[column1,fnParam2], 
                                    function(err, result)
                                    {
                                         if (err) { console.log(err); return; }
                                         var count = String(result.rows[0][0]);
                                         console.log("count result:" + count)
                                    });
                                    callback(null, count);
                                 }
                                 ],
                                 function (err, result) {
                                    console.log("Done" + result);
                                });
                });
};

1 个答案:

答案 0 :(得分:1)

只需快速查看代码,我就注意到了你的#34;回调"调用不在传递给执行的回调函数中。这意味着在获得execute方法的结果之前,您将进入瀑布的下一步。这里稍微修改了您的代码以证明我的意思。另外,当您完成连接时,请不要忘记释放连接。

var update = function(fnParam1, fnParam2){  
    oracledb.maxRows = 10000;   
oracledb.getConnection(
            {
            user          : dbConfig.user,
            password      : dbConfig.password,
            connectString : dbConfig.connectString
            },

function(err, connection)
            {
                if (err) { console.log(err.message); return; }
                async.waterfall([
                                 function(callback) {
                                     connection.execute("select column1 from table1 where param1 =:nm",[fnParam1], 
                                     function(err, result)
                                     {
                                        if (err) { console.log(err); return; }

                                        column1 = String(result.rows[0][0]);
                                        callback(null, column1, connection);
                                     });
                                 },
                                 function(column1, connection, callback) {
                                    connection.execute("select count(*) from table2 where column1 = :par1 and column2= :par2",
                                    [column1,fnParam2], 
                                    function(err, result)
                                    {
                                         if (err) { console.log(err); return; }
                                         var count = String(result.rows[0][0]);
                                         console.log("count result:" + count);
                                         callback(null, count);
                                    });
                                 }
                                 ],
                                 function (err, result) {
                                    console.log("Done" + result);
                                });
                });
};