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

Javascript 带有Sequelize的Node.js数据库模块,javascript,node.js,async-await,sequelize.js,require,Javascript,Node.js,Async Await,Sequelize.js,Require,为了使代码更具可读性,我尝试将所有与数据库相关的代码移动到单个文件中。并使用Sequelize作为ORM。我想这个文件,当包括提供一个随时可用的数据库。表模式也由Sequelize管理,这就是为什么我在第一次运行时使用sync()方法来创建表。不幸的是,当我第一次运行应用程序时,我得到一个错误,即使用此代码时该表不存在: 文件:test.js const database = require('./dbInit'); (async () => { await database.

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

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


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

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

  • 连接
  • 同步
  • 做数据库操作
  • 您必须按照以下方式进行:

    将模型文件作为:
    db/schemas/User.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;
    
    并为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);
    })();
    
    另外,当开发者不关心db何时连接以及express app何时监听端口时,忘记web应用中使用的示例。
    您的问题不同-您希望立即执行db查询,因此必须确保成功建立连接和同步。

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

    这很奇怪,现在日志看起来不错,但我仍然得到“test.testtables”不存在“error-有什么想法吗?”NicolasBouvrette阅读了关于迁移的文章,在所有事情之前必须创建表
    sync()
    不是这样做的吗?我在寻找一种干净的方法来动态创建表。似乎我的问题现在更像是Node.js sync异步问题?顺便看看:选项部分,它有
    sync:true
    默认启用。非常奇怪,表没有创建。@NicolasBouvrette通过传递
    sync:{force:true}