具有Sequelize的Node.js数据库模块

时间:2018-10-06 15:11:45

标签: 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

我找到了一种方法,可以在对数据库的调用之前(在max('id')调用之前的test.js中)添加如下代码:

await database.sequelize.sync();

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

我一直在寻找同步模块的加载方式,但似乎还没有选择。

2 个答案:

答案 0 :(得分:0)

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

  1. 连接
  2. 同步
  3. 执行数据库操作

您必须按照以下方式进行操作:

将模型文件作为db放置到db/schemas/User.js文件夹中

并为db制作模块文件: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);
})();

P.S。当开发人员不在乎数据库何时连接以及何时Express应用程序将在端口上侦听时,请忘记在Web应用程序中使用的示例。 您的问题有所不同-您想立即进行数据库查询,因此必须确保成功建立连接并同步。

答案 1 :(得分:0)

您可以跟进我的github存储库Sequelize-DemoApp。这是一个完全工作的全栈应用程序,专门用于演示和理解Sequelize.js及其与nodejs的集成