【问题标题】:using an enviroment variable for local sequelize configuration使用环境变量进行本地 sequelize 配置
【发布时间】:2016-12-10 00:13:41
【问题描述】:

我希望使用 sequelize 在我的项目的 config.json 文件中使用环境变量。我正在使用 dotenv 在本地设置环境变量。我的 config.json 文件是这样的

{
  "development": {
    "username": process.env.DB_USER,
    "password": process.env.DB_PASS,
    "database": process.env.DB_DATABASE,
    "host": process.env.DB_HOST,
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "use_env_variable": "JAWSDB_URL",
    "dialect": "mysql"
  }
}

我遇到的问题是我无法在 config.json 文件中使用变量。看起来我可以使用“use_env_varable”键并将env变量用于我的连接字符串。所以我想我要么需要一种方法来找出我的本地 mysql 数据库的组合连接字符串,要么需要一种在 config.json 中使用变量的方法。有什么解决办法吗?

【问题讨论】:

    标签: mysql json node.js environment-variables sequelize.js


    【解决方案1】:

    您应该将config.json 文件更改为config.js 模块,并确保require 位于最顶部的dotenv

    require('dotenv').config(); // this is important!
    module.exports = {
    "development": {
        "username": process.env.DB_USERNAME,
        "password": process.env.DB_PASSWORD,
        "database": process.env.DB_DATABASE,
        "host": process.env.DB_HOST,
        "dialect": "mysql"
    },
    "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql"
    }
    };
    

    注意:更新您的 .sequelizerc 文件以匹配新的配置文件。

    "config": path.resolve('./config', 'config.js'),
    

    【讨论】:

    • 只是预感,点击上面的链接查看如何从他们的文档.sequelizerc docs更新您的 .sequelizerc 文件
    • 挣扎了一个小时后,尝试谷歌搜索并找到答案。我的问题解决了。谢谢
    【解决方案2】:

    我为此做了很多工作。如果你运行heroku run bash,我不知道为什么 Sequelize 在环境中不使用生产。我能够通过根据JAWSDB_URL 而不是NODE_ENV 修改Sequelize 对象来使其工作。

    require("dotenv").config();
    const express = require("express")
    const app = express();
    let seq;
    
    //express app configuration
    
    if (process.env.JAWSDB_URL) {
        console.log("There is a JAWS DB URL")
        seq = new Sequelize(process.env.JAWSDB_URL)
    }
    else {
        seq = require("./models").sequelize
    }
    seq.sync().then(() => {
      app.listen(PORT, () => console.log('server started on port ' + PORT));
    })
    

    【讨论】:

      【解决方案3】:

      在根目录下创建一个 .sequelizerc 文件。

      var path = require('path');
      module.exports = { 
      'config': path.resolve('server/config', 'config.js'),
      'models-path': path.resolve('server/models'),
      'seeders-path': path.resolve('server/seeders'),
      'migrations-path': path.resolve('server/migrations')}
      

      然后在 config 文件夹中创建 config.js。在 config.js 中使用以下代码

      const dotenv = require("dotenv");
      dotenv.config({ path: "config.env" });
      
      module.exports = {
        development: {
          username: process.env.DB_USERNAME,
          password: process.env.DB_PASSWORD,
          database: process.env.DB_DBNAME,
          host: process.env.DB_HOST,
          dialect: process.env.DB_DIALECT,
          encrypt: process.env.DB_ENCRYPT,
          pool: {
            max: parseInt(process.env.DB_POOL_MAX),
            min: parseInt(process.env.DB_POOL_MIN),
            acquire: parseInt(process.env.DB_POOL_ACQUIRE),
            idle: parseInt(process.env.DB_POOL_IDLE),
          },
        },
      

      然后运行迁移和播种。

      【讨论】:

        【解决方案4】:

        假设您使用的是 Passport、Sequelize、MySql:

        在通过 sequelize 设置的 index.js 文件中,查找这一行:

        var sequelize = new Sequelize(config.database, config.username, config.password, config);
        

        尝试将其更改为:

        var sequelize = new Sequelize(process.env.DB_DATABASE, process.env.DB_USERNAME, process.env.DB_PASSWORD, config);
        

        你的 .env 应该有:

        DB_USERNAME:root (or whatever your username is)
        DB_PASSWORD:NYB (whatever your password is)
        DB_DATABASE:whatever_your_dbNameis_db
        

        最后,根据您的护照策略设置,寻找以下内容:

        user.sequelize.sync().then(function(){
        }...
        

        您需要放置:database:process.env.DB_DATABASE

        user.sequelize.sync().then(function(){
             database:"process.env.dbn"
        }...
        

        这意味着您应该从 config.json 中删除该 key:value。

        去应该很好,你不必转换任何东西。 Sequelize 会处理所有这些。

        【讨论】:

        • 我忘记添加的一件事是您可能必须删除(重置)您的数据库/表才能完成这项工作。
        【解决方案5】:

        您也可以使用 use_env_variable 进行开发。您似乎已经在使用 dotenv,所以我假设您已经设置了一个 .env 文件。只需添加这一行:

        LOCALDB=mysql://[user]:[pass]@[sqldomain]/[db name]

        根据需要替换 [] 中的内容,并在您的配置文件中将“use_env_variable”设置为 LOCALDB,就像您将 JAWSDB 用于生产一样。

        【讨论】:

          猜你喜欢
          • 2016-08-11
          • 2013-02-09
          • 2021-11-04
          • 1970-01-01
          • 2020-04-05
          • 2013-11-13
          • 2018-01-22
          • 2020-02-22
          • 2022-08-13
          相关资源
          最近更新 更多