NodeJs Как экспортировать соединение SQLite - PullRequest
0 голосов
/ 03 мая 2020

Я запускаю приложение express, в котором я хочу инициализировать / открыть соединение с БД перед тем, как начать прослушивать порт.

сервер. 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, которая может создать пользователя.

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 не будет работать, так как он экспортирует asyn c. Даже если это сработало, оно создает новое соединение каждый раз, когда импортируется.

1 Ответ

2 голосов
/ 03 мая 2020

Обратите внимание, что в этом случае dbUtils. js не будет работать, так как он экспортирует asyn c. Даже если это работает, оно создает новое соединение каждый раз, когда оно импортируется.

Это не должно быть.

Вы экспортируете результат вызова этой асинхронной c функции. , который будет обещанием. init() вызывается только один раз. В то время как вам нужно await это везде, где вы его используете (или используете .then()), как только Обещание будет разрешено, будущее .then или await немедленно разрешится к тому же значению.

В другие ваши файлы ....

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

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