javascript - 带有 Sequelize 的 Node.js 数据库模块

标签 javascript node.js async-await sequelize.js require

为了使我的代码更具可读性,我试图将所有与数据库相关的代码移动到一个文件中。并将 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

我找到了一种方法来使其工作,就像在调用 DB 之前(在 max('id') 调用之前的 test.js 中)添加这样的:

await database.sequelize.sync();

是否有任何其他方法可以使 dbInit 模块完全独立,而不必在所有其他需要数据库连接的文件中添加此 sync() 调用?

我一直在寻找同步模块加载,但它似乎还不是一个选项。

最佳答案

由于异步行为,您想要执行的所有操作:

  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);
})();

附言当开发人员不关心 db 何时连接以及 express app 何时监听端口时,请忘记 Web 应用程序中使用的示例。 您的问题不同 - 您希望立即进行数据库查询,因此您必须确保连接和同步已成功建立。

关于javascript - 带有 Sequelize 的 Node.js 数据库模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52680436/

相关文章:

c# - 应用程序调用了为不同线程编码的接口(interface)。 (来自 HRESULT : 0x8001010E (RPC_E_WRONG_THREAD)) 的异常

python - 强制异步函数在下一个任务之前完成

javascript - 使用 `JQuery.remove()` 后如何重新打开某些东西?

javascript - 仅在特定屏幕上渲染子组件中的按钮

javascript - 我需要使用 underscore.js 旋转数组的矩阵元素。我有解决方案,但代码很大我想缩短它?

javascript - 使用 Node 将字符串解析为 JSON 会给出意外的标记,验证器说可以

javascript - 如何从对象中的对象数组更新对象?

node.js - 呃!堆栈错误: `gyp` failed with exit code: 1

node.js - 如何删除和更新 xml2js 中的 XML 标签

javascript - 如何在JS/TS中实现伪阻塞异步队列?