Проблемы с Node.js и oracledb - PullRequest
       42

Проблемы с Node.js и oracledb

0 голосов
/ 05 октября 2018

У меня проблема со скриптом node.js на работе (кстати, я довольно новичок в работе с узлами в целом).Когда я запускаю цикл 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 голосов
/ 05 октября 2018

Быстрое краткое изложение основных опций:

Обратные вызовы

Используйте пакет типа https://github.com/caolan/async для простого управления обратными вызовами "for loop".(есть и другие пакеты)

forEach не ожидает завершения вашего обратного вызова, поэтому все они работают одновременно.Вы также можете управлять своим собственным циклом for, используя обратный вызов с итератором, который останавливается при достижении максимального итератора.

Но вы также можете использовать:

require('util').promisify для преобразования узлаФункция обратного вызова в стиле .js

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

для обещания, которое затем можно выполнить следующим образом:

Обещания

Разрешать обещания одно за другим (т.е. в последовательности)?

Async / Await

Или то, что вы, вероятно, хотели бы ...

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