首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sequelize和module.exports

Sequelize和module.exports
EN

Stack Overflow用户
提问于 2020-05-15 13:02:43
回答 2查看 2.4K关注 0票数 2

我是nodejs和续集的新手,一直有一个我无法解决的问题。我想使用我创建的连接并将其导出到一个模块。

如下所示:

代码语言:javascript
复制
const dotEnv        = require('dotenv');
const Sequelize     = require('sequelize');

dotEnv.config();

module.exports.connection = async () => {
    try{
        const sequelize = new Sequelize(process.env.DB_DATABASE, process.env.DB_USER, process.env.DB_PASSWORD, {
            host: process.env.DB_HOST,
            port: process.env.DB_PORT,
            dialect: 'mysql',
            logging: false,
            define: {
                charset: 'utf8',
                collate: 'utf8_general_ci',
            },
        });
        await sequelize
        .authenticate()
        .then(() => {
            console.log('Connection has been established successfully.');
        })
        .catch(error => {
            throw error;
        });
    }catch(error){
        throw error;
    }
}

然后,我有另一个文件,我想在其中使用它,如下所示

代码语言:javascript
复制
const Sequelize     = require('sequelize');
const { connection }= require('../database');

const accountModel = connection.define('accounts', {
  // attributes
  id: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      primaryKey: true
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  email: {
      type: Sequelize.STRING,
      unique: true
  },
  password: {
      type: Sequelize.STRING,
      allowNull: false,
      //is: /^[0-9a-f]{64}$/i
  },
  permission: {
      type: Sequelize.STRING,
      allowNull: false
  },
  discount: {
      type: Sequelize.INTEGER,
      allowNull: false
  }
}, {
  freezeTableName: true
});
module.exports = connection.model('accounts', accountModel);

问题是我被告知: TypeError: connection.define不是一个函数,

连接工作正常,数据库正在运行,其他一切都正常,最后,如果我这样做,它也能工作:

代码语言:javascript
复制
const dotEnv        = require('dotenv');
const Sequelize     = require('sequelize');

dotEnv.config();

const sequelize = new Sequelize(process.env.DB_DATABASE, process.env.DB_USER, process.env.DB_PASSWORD, {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mysql',
    logging: false,
    define: {
        charset: 'utf8',
        collate: 'utf8_general_ci',
    },
});

const accountModel = sequelize.define('accounts', {
  // attributes
  id: {
      type: Sequelize.UUID,
      defaultValue: Sequelize.UUIDV4,
      primaryKey: true
  },
  name: {
    type: Sequelize.STRING,
    allowNull: false
  },
  email: {
      type: Sequelize.STRING,
      unique: true
  },
  password: {
      type: Sequelize.STRING,
      allowNull: false,
      //is: /^[0-9a-f]{64}$/i
  },
  permission: {
      type: Sequelize.STRING,
      allowNull: false
  },
  discount: {
      type: Sequelize.INTEGER,
      allowNull: false
  }
}, {
  freezeTableName: true
});
module.exports = sequelize.model('accounts', accountModel);

我真的不知道为什么模块一不能工作,但是直接的方法可以。我已经尝试搜索谷歌和堆栈溢出的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-15 14:38:04

第一种方法的问题是首先导出一个async function,而不是Sequelize instance (就像在第二个例子中那样),其次,函数本身没有返回任何内容。这就是为什么在另一个文件中需要connection.define()函数的原因。

database.js中尝试这一点,它应该可以工作:

代码语言:javascript
复制
module.exports.connection = new Sequelize(process.env.DB_DATABASE, process.env.DB_USER, process.env.DB_PASSWORD, {
            host: process.env.DB_HOST,
            port: process.env.DB_PORT,
            dialect: 'mysql',
            logging: false,
            define: {
                charset: 'utf8',
                collate: 'utf8_general_ci',
            },
        });

您可以在其他地方完成所有的authenticate()try {} catch (error) {}操作,例如,在您的第一个js文件中,通过要求相同的database.js文件启动服务器。但是对于模型定义,重要的是要将new Sequelize()实例导出到它们,以便能够使用define()

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 13:49:26

我会做这样的事。在connections文件中,导出函数,然后在accountModel文件中导入和调用函数。

connection.js:

代码语言:javascript
复制
exports.connection= async function() { // Stuff here }

accountModel.js:

代码语言:javascript
复制
const { connection }= require('../database');
let connection = await connection.connection();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61819904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档