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 被解析,未来的 .then
或 await
将立即解析为相同的值.
在您的其他文件中....
const dbPromise = require('./database/dbUtils');
async function createUser(user) {
const db = await dbPromise;
await db.exec(...);
}
我是 运行 一个快速应用程序,我想在其中 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 被解析,未来的 .then
或 await
将立即解析为相同的值.
在您的其他文件中....
const dbPromise = require('./database/dbUtils');
async function createUser(user) {
const db = await dbPromise;
await db.exec(...);
}