尝试使用提供的 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" }
就不会出现此问题。
问题源于您从函数返回两次。这可能是唯一有可能出现这种情况的情况,但是当运行此代码时:
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);
}