在 NodeJS 中使用带有 SQL 请求的 While 循环

Posted

技术标签:

【中文标题】在 NodeJS 中使用带有 SQL 请求的 While 循环【英文标题】:Using A While Loop With An SQL Request In NodeJS 【发布时间】:2020-12-02 13:44:12 【问题描述】:

所以我尝试使用 while 循环来遍历数组。我已经成功地获得了 sql 连接以使用没有 while 循环的代码打印结果,所以我知道查询有效,只是在 while 循环中不起作用。

var sql = "SELECT algorithm FROM algorithms WHERE AlgorithmName = " + con.escape(PLLNames[0]);
    con.query(sql, function (err, result) 
      console.log("Sup")
      if (err) throw err;
      console.log("Result: " + result);
      x+=1;
      console.log(x)
    );
  res.render("PLL", 
    algorithmTest: result,
  );

使用类似的东西可以正常工作,但是当我编辑它以进行循环时,代码会中断。我知道它没有执行查询,因为它没有记录结果,也没有给出错误。由于某种原因,代码甚至没有尝试执行查询。这就是我试图做的工作

 x = 0;
  while (x < 20) 
    var sql = "SELECT algorithm FROM algorithms WHERE AlgorithmName = " + con.escape(PLLNames[0]);
    con.query(sql, function (err, result) 
      console.log("Sup")
      if (err) throw err;
      console.log("Result: " + result);
      x+=1;
      console.log(x)
    );
  ;
  res.render("PLL", 
    algorithmTest: result,
  );

有人知道为什么会这样吗?

【问题讨论】:

假设con.query本质上是异步的,给定一个回调。 请仅使用带参数的准备好的语句参见***.com/questions/15778572/…以防止sql注入 【参考方案1】:

出现问题是因为con.query 异步工作,因此res.render 不等待while 循环调度的sql 查询。您可以通过使用递归函数而不是 while 循环来解决此问题:

function next(counter, limit, callback) 
    if (counter >= limit) 
        callback()
        return;
    
    var sql = "your SQL query";
    con.query(sql, function (err, result) 
        if (err) throw err;
        console.log("Result: " + result);
        counter+=1;
        next(counter, limit, callback);
    );

next(0, 20, function() 
    res.render("PLL", 
        algorithmTest: result,
    );
)
 

【讨论】:

【参考方案2】:

最好的解决方案是有一个堆栈来保存应该运行的内容。 我认为这个示例将帮助您入门并且易于理解和理解。

const stack = [];
let x = 0;
const results = [];
// Fill the stack
while (x < 20) 
  // are you sure you don't want PLLNames[x] ?
  stack.push("SELECT algorithm FROM algorithms WHERE AlgorithmName = " + con.escape(PLLNames[0]));
  x++;


function worker() 
  if(stack.length > 0) 
    let sql = stack.shift();
    con.query(sql, function (err, result) 
      console.log("Sup")
      if (err) throw err;
      console.log("SQL: " + sql);
      console.log("Result: " + result);
      results.push(result);
      worker();
    );
   else 
    // Not sure what you want to do with the results, but you got 20 of them so somehow you need to process it into one result.
    res.render(JSON.stringify(results));
  

【讨论】:

以上是关于在 NodeJS 中使用带有 SQL 请求的 While 循环的主要内容,如果未能解决你的问题,请参考以下文章

带有异步请求的 NodeJS

如何在 NodeJS 中访问 SQL 请求的结果?

如何使用 Nodejs 上传带有 json 的图像

带有 MySQL 的 NodeJS - 从数组中向 SQL 插入多行的最佳方法 [重复]

angularjs http请求到nodejs api

发出发布请求时出现NodeJS CORS错误