当我们在 NodeJS 中返回 Promise 时如何正确关闭数据库连接

Qua*_*ieu 3 javascript database node.js async-await

我有两个这样的函数:

async getMatches() {
  try {
    const result = await readRowsFromDb('SELECT * FROM matches');
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

async readRowsFromDb(query) {
  const db = await sqlite.open(this.DATABASE_PATH);
  const promise = db.all(query);
  return promise;
}

getMatches();
Run Code Online (Sandbox Code Playgroud)

问题是我找不到合适的地方放线

db.close()
Run Code Online (Sandbox Code Playgroud)

AFAIK,我应该在得到结果后关闭数据库,但结果在不同的函数中,关闭 getMatches 内的数据库似乎不正确。

我尝试在像这样返回 readRowsFromDb 中的承诺之前关闭数据库

const promise = db.all(query);
db.close();
return promise;
Run Code Online (Sandbox Code Playgroud)

有效。但我仍然觉得有些不对劲,因为我在调用查询后立即关闭数据库连接而不是等待它完成,它不应该起作用。

请指教。

jfr*_*d00 6

如果您想readRowsFromDb()管理数据库的打开和关闭(这是必须的,因为没有其他人拥有db您刚刚打开的对象),您可以这样做:

async readRowsFromDb(query) {
  let db;
  try {
      db = await sqlite.open(this.DATABASE_PATH);
      let result = await db.all(query);
      return result;
  } finally {
      if (db) db.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

请记住,因为这是一个函数,所以即使您自己没有直接返回承诺,async它仍然会返回一个解析为 的承诺。result这就是异步函数的工作原理。


可以在另一个函数中关闭数据库的唯一其他方法是,如果您从其他函数传入数据库(这样它可以管理关闭它),或者从这个函数返回数据库,以便其他人可以在关闭之前使用它它。按照您的readRowsFromDb()函数现在的情况,您必须在函数中关闭它。