NodeJs 如何导出 SQLite 连接

NodeJs How to export a SQLite connection

我是 运行 一个快速应用程序,我想在其中 initialise/open 一个数据库连接,然后再开始监听端口。

server.js:

const express = require('express');
const morgan = require('morgan');
const db = require('./database/dbUtils');

db.init();
const app = express();
...
app.listen(PORT, () => console.log(`Server running on port ${PORT}.`));

然后,我的想法是我可以在我的模型中使用该连接来进行 CRUD 操作。例如,我有一个可以创建用户的用户模型。

user.js:

const db = require('./database/dbUtils');

async function createUser(user) {
    await db.exec("INSERT INTO users ...");
}

如何导出连接?我知道导出是同步的,所以直接导出DB是不可能的。我如何以 常规 方式(承诺 and/or 回调)做到这一点?

dbUtils.js:

const sqlite = require('sqlite3');
const sql = require('sqlite');

async function init() {
    try {
        return await sql.open({
            filename: './database/database.db',
            driver: sqlite.Database 
        });    
    } catch (e) {
        console.error(e);
    }
}

module.exports = init();

请注意,在这种情况下,dbUtils.js 将无法工作,因为它正在导出异步。即使有效,每次导入时都会创建一个新连接。

Note, in this case, dbUtils.js won't work as it's exporting an async. Even if it worked, it's creating a new connection every time it's imported.

不应该。

您正在导出调用此异步函数的结果,这将是一个 Promise。 init() 只被调用一次。虽然你确实需要 await 在任何地方使用它(或使用 .then()),但一旦 Promise 被解析,未来的 .thenawait 将立即解析为相同的值.

在您的其他文件中....

const dbPromise = require('./database/dbUtils');

async function createUser(user) {
  const db = await dbPromise;
  await db.exec(...);
}