0

Here is what I am trying. In last I am returning the account number so that I can use it in another function but it seems like the value should be returned before closing the connection, or by any different approach. Can you please help me to identify what can be changed here so that I can utilize the returned value.

PS: It's a Nodejs program, using Oracle DB connection.

function getShipmentData(shipment){
  var defer = q.defer();
  var tnt_account_number;
  var account_number;
  var dhl_account_number;
  var place_to_bil;
  var freight_terms_shp;
  var place_to_repair;
  var shipment_id;
  oracledb.outFormat = oracledb.OBJECT;
  console.log("before getConnection")
  oracledb.getConnection(
  {
    user          : settings.ora_db_user,
    password      : settings.ora_db_password,
    connectString : settings.ora_db_host+':'+settings.ora_db_port+'/'+settings.ora_db_service
  }, 
  function(err, connection)
  {
    console.log("After getConnection")
    if (err) {
      writeDebug({'error':err.message});
      defer.reject(err);
    }


    const shipment_sql = `select r.PLACE_ID_TO_BILL as Place_TO_BILL, s.freight_terms_shp as Freight_Terms, 
    r.PLACE_ID_SHIP_TO as Place_To_Repair, s.shipment_id as Shipment_ID
    from shipment s inner join request r on s.request_id = r.request_id
    where s.shipment_id = :SHIPMENT_ID`

    var bindVars = {
      SHIPMENT_ID: shipment
    };

    connection.execute(
      shipment_sql,
      bindVars,

      function(err, result)
      {
        var row;

        if (err) {
          console.log("Error:", err)
          connection.close();
          defer.reject(err);
        }

        var results = result.rows

        Object.keys(results).forEach(function(key){
            row = results[key];

            place_to_bil = row.PLACE_TO_BILL
            freight_terms_shp = row.FREIGHT_TERMS
            place_to_repair = row.PLACE_TO_REPAIR
            shipment_id = row.SHIPMENT_ID

            console.log("place_to_bil from Data:",place_to_bil);
            console.log("freight_terms from Data:",freight_terms_shp);
            console.log("place_to_repair from Data:",place_to_repair);
            console.log("shipment_id from Data:",shipment_id);
        })

        function getAccountNumber(){
          if(freight_terms_shp == 'ABHTC') {
            if(place_to_repair == 'MYTPIC-401' && place_to_bil == 'GTHBYR-001')
                 tnt_account_number = '8934734';

            else if (place_to_repair == 'CNHBNT-40000' && place_to_bil == 'CBCINF-001') {
                 tnt_account_number = '3489523';
              }

          else   tnt_account_number = '5438648';
          }
          return tnt_account_number;
        }

        account_number = getAccountNumber();
        console.log("TNT Account Number before closing connection:", account_number)
        connection.close();
        console.log("TNT Account Number after closing connection:", account_number)
        defer.resolve(result.rows);
      });
  });
  console.log("Account Number getting returned?", account_number);
  return account_number;
}
Sam_2207
  • 2,759
  • 2
  • 9
  • 15
  • You can not return value from callback function. https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – Shihab Mar 06 '20 at 10:53
  • 1
    Did you inherit an older code base that you need to maintain? I'm seeing a strange mix of callbacks and q based promises. You should drop the use of q and move to native promises (even if just to cut down on dependencies). Work through this series on async patterns: https://jsao.io/2017/06/how-to-get-use-and-close-a-db-connection-using-various-async-patterns/ Then see this series on building a REST API: https://jsao.io/2018/03/creating-a-rest-api-with-node-js-and-oracle-database/ – Dan McGhan Mar 06 '20 at 15:47
  • @DanMcGhan, Yes that's next on my list. – Sam_2207 Mar 09 '20 at 05:18

0 Answers0