Node.js和oracledb的问题

时间:2018-10-05 15:00:40

标签: javascript node.js oracledb oracledb-npm

我在工作时遇到了node.js脚本的问题(总的来说,我对node很陌生)。当我通过forEach循环运行时,似乎它可能异步运行,因此没有运行问题。但是,当我查看软件包文档时,没有发现有关使sql执行同步运行的任何信息。预先感谢您的帮助!

function getLastLoginAndProviderType(jsonObj, connection){
console.log(jsonObj);
jsonObj.forEach(obj => {
console.log("Processing: " + obj["email"]);
//obj["email"], obj["first"], obj["last"], obj["eid"], obj["role"] 

var sql = "select LAST_LOGGED_IN_TIME from EINV_OWNER.CONTACT where EMAIL_ADDRESS='" + obj['email'] + "'";

connection.execute(
  sql, {}, { maxRows: 15 },
  function(err, result) {
    if (err) {
      console.error("Query Error: " + err.message);
    } else {
      console.log("Number of rows returned: " + result.rows.length);

      obj["lastLoggedIn"] = "null";
      obj["supplierOrProvider"] = "null";
    }
  });
});

脚本运行时,我希望看到类似的东西:

Processing: XXX@XXX.com
Number of rows returned: XX
Processing: XXX@XXX.com
Number of rows returned: XX
...
Processing: XXX@XXX.com
Number of rows returned: XX

但是,我最终得到的是:

Processing: XXX@XXX.com
Processing: XXX@XXX.com
Processing: XXX@XXX.com
...
Processing: XXX@XXX.com
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
Query Error: NJS-003: invalid connection
...
Query Error: NJS-003: invalid connection

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

快速浏览基本选项:

回调

使用https://github.com/caolan/async之类的包来轻松管理回调的“ for循环”。 (还有其他软件包)

forEach不等待您的回调完成,因此它们都同时运行。您还可以通过使用带有迭代器的回调来管理自己的for循环,该回调在达到最大迭代器时停止。

但是您也可以使用:

require('util').promisify转换为node.js样式的回调函数

myFn(foo,bar,<function(err,data){}>) 

承诺,然后您可以执行以下操作:

承诺

Resolve promises one after another (i.e. in sequence)?

异步/等待

或者您可能想要...

async function myFunction(){
  for(i=0;i<jsonObj.length;i++){
    try{
      let result = await connection.execute(sql, {}, { maxRows: 15 })
      console.log("Number of rows returned: " + result.rows.length);
      obj["lastLoggedIn"] = "null";
      obj["supplierOrProvider"] = "null";
    }catch(e){
      console.error("Query Error: " + err.message);
    }
  }
}