首页 > 解决方案 > Node.js 和 oracledb 的问题

问题描述

我在工作时遇到了 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

有任何想法吗?谢谢!

标签: node.jsnode-oracledb

解决方案


基本选项的快速概述:

回调

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

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

但你也可以使用:

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

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

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

承诺

一个接一个地解决承诺(即按顺序)?

异步/等待

或者你可能想要的...

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

推荐阅读