为什么我的 MySQL 函数总是“未定义”?

时间:2021-02-13 19:52:00

标签: javascript mysql

使用我的功能之一时:

    async function fetchServerChance(serverID) {
    var returnValue;
    con.query("SELECT chance FROM serversConfigs WHERE serverID = '"+serverID+"' LIMIT 1", function (err, rows) {
     if (err) throw err;
     returnValue = (rows[0].chance);
    });
    return returnValue;
}
console.log(await fetchServerChance(message.guild.id));

它只返回“未定义”,请有人以上帝的名义解释我应该做什么。我试过做很多事情,比如 return await returnValue; 并让其他一些行在其中包含 await

1 个答案:

答案 0 :(得分:0)

您当前的代码是这样工作的

async function fetchServerChance(serverID) {
    var returnValue; // 1
    con.query("SELECT chance FROM serversConfigs WHERE serverID = '"+serverID+"' LIMIT 1", function (err, rows) {
     if (err) throw err;
     returnValue = (rows[0].chance); // 4
    }); // 2
    return returnValue; // 3
}

1 - returnValue 在函数顶部声明,其值为 undefined

2 - con.query() 正在调用 MySQL(但立即返回并在结果准备好时调用提供的函数)

3 - 函数返回 undefined,它是 returnValue

的当前值

4 -(一段时间后)returnValue 更新为查询结果(但没有任何东西可以使用该值)

您无法更改上述执行顺序。 con.query() 是异步的,但不会向您返回 Promise(因此您不能在那里停止执行并为结果 await)。函数需要返回一些东西,而它还没有结果。

您可以将 con.query() 包装成一个 Promise 并返回它。这将弥合 MySQL 库 API(接受回调函数)之间的差距,并允许使用 async/await 方法。

async function fetchServerChance(serverID) {
    const returnValue = new Promise(function (resolve, reject) {
      con.query(
        // serverID value will be escaped for safety and put into ? placeholder
        // see https://github.com/mysqljs/mysql#escaping-query-values
        "SELECT chance FROM serversConfigs WHERE serverID = ? LIMIT 1", [serverID], 
        function (err, rows) {
            // promise will be rejected if error happens (async function can catch the error with try/catch clause
            if (err) { reject(err) };
            // promise will resolve to value of chance
            resolve(rows[0].chance); 
        }
      );
    });
    return returnValue; // promise of future value
}

附言

有关 Promise 的更多信息:PromiseMaking asynchronous programming easier with async and await

附言

这是一个常见问题,因此有 promise-mysql 库可以执行上述操作(返回 Promises)并允许将 MySQL 查询重写为 const rows = await con.query("QUERY")