簡體   English   中英

來自 Tedious Request.on 的行結果未保存

[英]Row results from Tedious Request.on not being saved

我的 nodeJS 應用程序中有一個 function queryDatabase() ,它負責查詢 Azure SQL DB 並返回 Tious 結果。

目前,為了返回從數據庫中檢索到的數據,我正在遍歷查詢返回的行,將數據保存到一個 var(一個字典數組,實際上是 JSON),然后返回它。 但是,我遇到了一個問題,即在將任何內容分配給它之前返回 var(空)。

我很確定這與調用 return 后執行的 request.on() 中的回調函數有關,但是我對 JS 的這一面有點缺乏經驗,並且對在線文檔沒有太多的運氣/教程。

function queryDatabase(){


 console.log("Reading rows from the Table...");

  // Read all rows from table
  const request = new Request(
    `select TOP 5 level, city, address from [dbo].[mainTable];`,
    (err, rowCount) => {
      if (err) {
        console.error(err.message);
      }
    }
  );

  var result = [];

  request.on("row", (columns) => {
    var entry = {};
    columns.forEach((column) => {
      entry[column.metadata.colName] = column.value;
    });
    result.push(entry);
  });

  connection.execSql(request);

  return result;
}

任何幫助將不勝感激,干杯!

Request是一個事件發射器,所以它就是等待你關心的所有事件發生,然后返回結果。 這就是Promise的用途。 promise 是一個異步操作,將在未來某個日期解決。 您需要等待所有row事件被發出,收集它們,然后等待done事件,並解決 promise。 我已經修改了您的代碼以實現此目的,並顯示了使用示例。

function queryDatabase(){

  console.log("Reading rows from the Table...");

  // Read all rows from table
  const request = new Request(
    `select TOP 5 level, city, address from [dbo].[mainTable];`,
    (err, rowCount) => {
      if (err) {
        console.error(err.message);
      }
    }
  );

  return new Promise((resolve,reject)=>{
    const result = [];
  
    request.on("row", (columns) => {
      const entry = {};
      columns.forEach((column) => {
        entry[column.metadata.colName] = column.value;
      });
      result.push(entry);
    });

    request.on('error',error=>reject(error));// some error happened, reject the promise
    request.on('done',()=>resolve(result)); // resolve the promise with the result rows.

    connection.execSql(request);

  });

}

用法如下圖:

queryDatabase().then(rows=>{
  // do something with the rows
})
.catch(error=>{
  // do something with the error
})

@r3wt 答案是正確的,但這個對我有用:

 request.on("doneProc", () => resolve(result)); 

代替

request.on('done',()=>resolve(result));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM