mysql - 变量值在 NodeJS ExpressJS 中变得未定义

标签 mysql node.js express

我在 MySQL 后端使用 ExpressJS 框架来处理 NodeJS。我在 for 循环内运行查询,我的循环和之后的工作取决于查询的返回值。我不太擅长 mysql 查询,所以我通过 for 循环运行它。 问题是,由于异步 [我猜!],for 循环在查询结果出来之前很久就结束了。

这是我的代码:

function search_people_step2(user_id, search_criteria, user_friend)
{
  var first_name_friends = [];
  var last_name_friends = [];


  for(var i = 0; i < user_friend.length; i++)
  {
    con.query("SELECT first_name, second_name FROM user WHERE userid = ?", user_friend[i],function(err, rows)
   {
     if(err)
     {
       //error;
     }
     else
     {
       if(rows.length == 0)
       { 
         //nothing gets returned
       }
       else {
         console.log(rows);
         first_name_friends[i] = rows[0].first_name;
         last_name_friends[i] = rows[0].second_name;
       }
 }
 });
}

现在,我可以在查询语句中获取值(使用 console.log),但是,在外部,该值变为空(未定义),因为其余代码已被计算。

我该如何解决这个问题? 提前致谢。

最佳答案

我在您的代码中发现的第一件事是您没有在 SQL 查询中使用 IN 语句(虽然与您的问题没有直接关系),这意味着您发出了尽可能多的请求因为 user_friend 中有条目。问题是 SQL 库是异步实现的,你无法避免。但是您可以使用 Promises 优雅地处理它ES6 特性: (我没有测试代码,但我认为它应该可以工作)

function search_people_step2(user_id, search_criteria, user_friend)
{
  return new Promise((resolve,reject)=>{
    var first_name_friends = [];
    var last_name_friends = [];
    var placeHolders=user_friend.map(()=>"?").join(",");
    con.query("SELECT first_name, second_name FROM user WHERE userid IN ("+placeHolders+")",user_friend,(err,rows)=>{
      if(err)
        reject(err);
      else{
        rows.forEach(row=>{
          first_name_friends.push(row.first_name);
          last_name_friends.push(row.second_name);
        });
        resolve({first_name_friends,last_name_friends});
      }
    });
  });
}

然后像这样调用你的函数:

search_people_step2(id,crit,friends).then(result=>{
  //handle result asynchronously as there is no choice
  console.log(result.first_name_friends);
  console.log(result.last_name_friends);
}).catch(err=>{
  //handle error
});

关于mysql - 变量值在 NodeJS ExpressJS 中变得未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37508811/

相关文章:

php - 为什么查询成功后我会从 mysqli_result::free 收到 fatal error ?

javascript - 提交按钮在 Chrome 中不起作用,但在 Firefox 中起作用

node.js - Mongoose 唯一验证器的行为与其他验证器不同

javascript - 如何在 x 次迭代后暂停循环 x 秒然后恢复

node.js - 使用 Travis CI 运行后,如何将 Node Express 和 React 应用程序部署到 Heroku?

node.js - Express.js 4 和域模块 : why domain doesn't handle the error?

php - mysql - 从表行中获取数据

mysql - 对另一个表中的所有 ID 运行 MySql 查询

node.js - 使用 pug extends 时传递变量

javascript - NodeJS 将数据从当前页面传递到另一个页面