我正在运行一个express应用程序,在开始监听端口之前,我想在其中初始化/打开一个DB连接。
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 ...");
}
如何导出连接我知道导出是同步的,所以不可能直接导出数据库。如何以常规方式(承诺和/或回调(做到这一点?
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
将无法工作,因为它正在导出异步。即使它有效,每次导入时都会创建一个新的连接。
注意,在这种情况下,dbUtils.js将无法工作,因为它正在导出异步。即使它有效,每次导入时都会创建一个新的连接。
不应该是。
您正在导出调用这个异步函数的结果,它将成为Promise。init()
只被调用一次。虽然在任何使用它的地方(或使用.then()
(都需要await
this,但一旦Promise被解析,未来的.then
或await
将立即解析为相同的值。
在您的其他文件中。。。。
const dbPromise = require('./database/dbUtils');
async function createUser(user) {
const db = await dbPromise;
await db.exec(...);
}