【问题标题】:Why can't I use a local variable after a SQL query in Node.js?为什么我不能在 Node.js 中的 SQL 查询后使用局部变量?
【发布时间】:2020-09-26 21:40:12
【问题描述】:

我必须选择数据库中所有可用的标签,所以我可以在我的函数中使用它们,但是我在查询的回调函数中为变量赋值后无法使用变量,为什么?

不工作的代码:

    let tags = [];
    db.query(
      `select * from tags`,
      (err, results) => {
        tags = results;
      } 
    )
    console.log(tags);
    return;

但这是可行的:

    let tags = [];
    db.query(
      `select * from tags`,
      (err, results) => {
        tags = results;
        console.log(tags);
      } 
    )
   return;

但是为什么呢?我想在该查询之后再次使用变量tags,但不知何故,分配给它的值在查询后被破坏了。我需要改变什么?

【问题讨论】:

  • 可见区域?
  • 嘿,我不明白你的意思。我已经发布了整个代码。
  • 我认为没有分配变量,因为正在创建副本。这可以在许多语言中看到。也可能是异步造成的。

标签: mysql sql node.js express


【解决方案1】:

Javascript 是异步语言,db.query 是一个异步的网络调用,所以如果你想使用查询的响应,它必须在 db.query 执行后调用。

在第一种情况下,console.log(tags);db.query 执行之前运行 你会收到undefined 的回复。

在第二种情况下,console.log(tags);db.query 执行后运行,这就是您从查询中获得响应的原因。

你使用 Promise 来使用它:

async function queryExec() {

    let tags = await promiseQuery(`select * from tags`);
    console.log(tags);
    return tags;
}

function promiseQuery(query) {
    return new Promise((resolve, reject) => {
        db.query(query, (err, results) => {
            if (err) {
                return reject(err);
            }
            resolve(results);
        })
    })
}

使用异步/等待:

async function queryExec() {

    let tags = await db.query(`select * from tags`);
    console.log(tags);
    return tags;
}

【讨论】:

  • 解决方案是什么?我不能在查询之前使用 await,因为我收到 await 仅对异步函数有效的错误。
  • 第二条语句是正确的,你可以使用它,你会得到回调函数的响应
  • 如果你想使用 async/await 函数应该像async function queryExec() {
  • 但查询后我需要变量tags。我需要以某种方式等待,直到查询完成,但是如何?如果我尝试使用 await 关键字,它就不起作用
  • @Opat 我已经更新了答案,你可以保证使用它并使用 async/await
【解决方案2】:

Query 是一个异步函数,因此在您尝试打印它时该值尚未返回。 但是,在回调函数中,您已经有了您期望的返回值。 如果您需要它同步运行,您可以等待查询函数,并获得值。

如果您将函数设置为异步,那么您将能够等待结果。 类似:

const foo = async () => {
    let tags = [];
    tags =  await db.query(
      `select * from tags`
    );
    console.log(tags);
    return;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多