【问题标题】:How can I get the first row of a MySQL query in JavaScript? [duplicate]如何在 JavaScript 中获取 MySQL 查询的第一行? [复制]
【发布时间】:2021-08-13 03:26:47
【问题描述】:

所以我有这个: 当我用 getAddress(banned); 询问地址时,我只是得到一个未定义的 我想保存该行并将其用于另一个函数,但由于该错误我不能。

function getAddress( banned ){
    let ip = [];
    connection.query(`SELECT Ips FROM sc_alts WHERE Name LIKE '${banned}'`, (error, rows) => {
        if (error) {
            throw error;
        }
        ip = rows[0].Ips;
    })
    return ip[0];
}

【问题讨论】:

  • 嗨,也许在使用结果之前检查if (rows.length === 0)
  • 我的意思是该行有一些东西,例如,如果我执行 console.log(rows[0].Ips),它会显示一些数据,但我无法保存,当我尝试时它说它未定义。
  • 您在 SQL 中遗漏了 %? SELECT Ips FROM sc_alts WHERE Name LIKE '%${banned}%',另外,不应该是 ip.push(rows[0].Ips) 并且只返回 ip。
  • 这可能是个愚蠢的问题,但您需要LIKE 子句吗?如果您正在检查一个特定的ip 地址,您可能想要检查一个特定的地址,例如WHERE Name = '${banned}',对吗? banned 是特定子网还是部分地址?
  • 如果rows 是一个数组,那么rows[0].Ips; 是该行/列中的值吗?如果是这样,您应该只是 return ip;?

标签: javascript mysql node.js


【解决方案1】:

您正在运行一个异步问题。 当您的函数返回值(返回 ip[0] 行)时,connection.query() 尚未返回,因为它是一个异步函数。所以你在没有实际运行 MySQL 查询的情况下返回值 ip[0],所以 ip 值仍然等于 [](定义时相同),所以 ip[0] 是未定义的。

例如,这里也发生了同样的事情:

function getAddress(banned) {
    let ip = [];
    setTimeout(function() {
        ip = ["hi", "world"];
        console.log("IP value is now:" + ip[0])
    }, 2000);
    console.log("I am returning the IP value: " + ip[0])
    return ip[0];
}

getAddress()

输出如下:

I am returning the IP value: undefined
IP value is now: hi

如您所见,return 语句发生在修改 ip 变量的 setTimeout 回调之前,与您的连接查询函数相同。

您可以做的是使您的函数异步,并等待结果以同步方式完成。 我没有特别尝试过这个,但是这样的东西应该可以工作:

async function getAddress( banned ){
    const rows= await connection.query(`SELECT Ips FROM sc_alts WHERE Name LIKE '${banned}'`)
    return rows[0].Ips;
}

参考Node.js Using async/await with mysql

【讨论】:

  • 谢谢,我最终重新设计了我的项目编码方式,因此我使用 createPool(); 以不同的方式进行查询,但是您的评论对于了解我在做什么非常有用!
猜你喜欢
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2011-05-28
  • 1970-01-01
  • 2020-04-24
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多