繁体   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