Модуль базы данных Node.js с Sequelize - PullRequest
0 голосов
/ 06 октября 2018

Чтобы сделать мой код более читабельным, я пытаюсь переместить весь код, связанный с базой данных, в один файл.и используйте Sequelize как ORM.Я хотел бы, чтобы этот файл, когда включен, предоставлял готовую к использованию базу данных.Схемы таблиц также управляются Sequelize, поэтому я использую метод sync() для создания таблиц при первом запуске.К сожалению, когда я запускаю приложение в первый раз, я получаю сообщение об ошибке, что таблица не существует при использовании этого кода:

Файл: test.js

const database = require('./dbInit');

(async () => {

    await database.testTable.max('id').then((maxId) => {
        console.log(maxId);
    });

})();

Файл:dbInit.js

const Sequelize = require('sequelize');

const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');

const testTable = sequelize.import('testTable');

const database = {
    sequelize: sequelize,
    testTable: testTable,
};

sequelize
    .authenticate()
    .then(() => {
        console.log('Connection to the database has been established successfully.');
    })
    .catch(error => {
        console.error(error);
    });

sequelize.sync();

module.exports = database;

Файл: testTable.js

const Sequelize = require('sequelize');

module.exports = (sequelize, DataTypes) => {
    return sequelize.define('testTable',
        {
            id: {
                type: Sequelize.BIGINT(19).UNSIGNED,
                primaryKey: true,
                autoIncrement: false,
            }
        }
    );
};

Когда я запускаю код как есть, без созданных таблиц, я вижу из журналов, что запрос выполняется раньшесоединение с базой данных доступно:

> node .\test.js
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT max(`id`) AS `max` FROM `testTables` AS `testTable`;
Connection to the database has been established successfully.
(node:1572) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: Table 'test.testtables' doesn't exist

Я нашел способ заставить его работать, добавив это как раз перед вызовом в БД (в test.js перед вызовом max('id')):

await database.sequelize.sync();

Есть ли другой способ сделать модуль dbInit полностью независимым и не добавлять этот вызов sync() во все другие файлы, для которых потребуется подключение к базе данных?

I 'Мы искали загрузку модуля синхронизации, но пока это не представляется возможным.

1 Ответ

0 голосов
/ 06 октября 2018

Из-за асинхронного поведения все операции, которые вы хотите выполнить:

  1. Соединение
  2. Синхронизация
  3. Выполнение операций с БД

Вы должны сделать это следующим образом:

поместить файлы модели в: db папку как: db/schemas/User.js

и создать файл модуля для БД: db/index.js

const Sequelize = require('sequelize');

const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');

const connect = async () => {
  try {
    await sequelize.authenticate();
    await sequelize.sync();

    console.log('Connection to the database has been established successfully.');
  }
  catch (error) {
    console.error(error.message);
    process.exit(-1);
  }
});

const model = name => database.models[name];

const User = sequelize.import('./schemas/User');

const database = {
    sequelize: sequelize,
    models: {User},
    connect,
    model
};

module.exports = database;

и в test.js:

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

(async () => {
    await db.connect();

    const User = db.model('User');

    const id = await User.max('id');

    console.log(id);
})();

PS забудьте о примерах, которые используются в веб-приложениях, когда разработчику все равно, когда подключится db и когда приложение express будет прослушивать порт.У вас другой вопрос - вы хотите немедленно выполнить запрос к базе данных, поэтому убедитесь, что соединение и синхронизация установлены успешно.

...