代码之家  ›  专栏  ›  技术社区  ›  Nicolas Bouvrette

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

  •  3
  • Nicolas Bouvrette  · 技术社区  · 6 年前

    为了提高代码的可读性,我尝试将所有与数据库相关的代码移到一个文件中。使用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') 电话):

    await database.sequelize.sync();
    

    调用所有其他需要数据库连接的文件?

    1 回复  |  直到 6 年前
        1
  •  1
  •   num8er    6 年前

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

    1. 连接
    2. 同步

    将模型文件放置到: 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);
    })();
    

    你的问题是不同的-你想做数据库查询立即,所以你必须确保连接和同步建立成功。

        2
  •  0
  •   AxDu    5 年前

    Sequelize-DemoApp . 它是一个完全工作的全栈应用程序,专门用来演示和理解Sequelize.js及其与nodejs的集成