gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:51 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com