MariaDB Async Await 始终返回未定义 | NodeJS

问题描述 投票:0回答:1

尝试使用提供的 npm 连接器包从 NodeJS 服务器中的 MariaDB 数据库获取令牌。我的 getter 函数内的日志记录(如下)输出正确的条目,然后它们应该返回堆栈。

async function getDBToken(uuid) {
  let conn;
  try {
      conn = await pool.getConnection();
      const rows = await conn.query(`SELECT * FROM Tokens WHERE uuid='${uuid}'`);
      console.log(rows)
      return rows;
  } catch (err) {
      throw err;
  } finally {
      if (conn) return conn.end();
  }
}

但是,调用者(API 端点,如下)会记录

undefined
(并将其用于逻辑),尽管之前已验证它具有正确的值。

  app.post("/loggedin/:timestamp", async (req, res) => {
    // ...
    const token = await getDBToken(req.body.uuid)
    console.log(token);
    // ...

我已经证实,这似乎是 MariaDB 中查询函数的一个问题(或者是我的错误),因为用任何简单的异步函数(如

conn.query
)替换
const test = async () => { return "test" }
就不会出现此问题。

node.js async-await mariadb
1个回答
0
投票

问题源于您从函数返回两次。这可能是唯一有可能出现这种情况的情况,但是当运行此代码时:

function foo() {

  try {
    return 1;
  } finally {
    return 2;
  }
}

console.log(foo());

您将得到

2
。得知这一点我很惊讶。

因此,代码的更正版本将如下所示:

async function getDBToken(uuid) {
  let conn;
  try {
      conn = await pool.getConnection();
      return conn.query('SELECT * FROM Tokens WHERE uuid=?', uuid);
  } finally {
      if (conn) conn.end();
  }
}

我取出了不需要的 catch 块,因为它没有做任何事情。此外,如果您的代码仅执行这 1 个查询,那么获取连接并释放它也没有真正的意义,您只需运行:

function getDBToken(uuid) {
  return pool.query('SELECT * FROM Tokens WHERE uuid=?', uuid);
}
© www.soinside.com 2019 - 2024. All rights reserved.