使用环境变量进行本地Sequelize配置

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_variable" 键,并使用 env 变量作为连接字符串。所以我想要么需要找到一种方法来获取本地 mysql 数据库的组合连接字符串,要么需要一种在 config.json 中使用变量的方法。有什么解决方案吗?

6个回答

92

你应该将config.json文件更改为config.js模块,并确保在顶部requiredotenv

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 文件。.sequelizerc 文档 - briancollins081
1
在苦苦挣扎了一个小时之后,我尝试了一下谷歌搜索,终于找到了答案。我的问题得到了解决。谢谢。 - Wisnu
1
我该如何在无法使用dotenv的情况下使其与NextJS一起工作? - Uri Abramson

2

我花了很长时间研究这个问题。我不知道为什么Sequelize在运行heroku run bash时,环境变量中明明有production却没有使用它。我通过根据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));
})

1
在根目录下创建一个 .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。使用以下代码:
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),
    },
  },

之后运行迁移和种子。


0
假设你正在使用Passport、Sequelize和MySql:
在index.js文件中通过sequelize进行设置,找到这一行:
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中删除那个键值对。

它应该可以正常工作,而且你不必转换任何东西。Sequelize会处理所有的事情。


我忘了提醒你的一件事,就是你可能需要删除(重置)你的数据库/表格才能使这个工作正常运行。 - Rod_R

0

这是我的config.js文件的内容:

const fs = require('fs');
require('dotenv').config();

module.exports = {
  "development": {
    "username": process.env.DB_USERNAME,
    "password": process.env.DB_PASSWORD,
    "database": process.env.DB_DATABASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_CONNECTION
  },
  "test": {
    "username": process.env.DB_USERNAME,
    "password": process.env.DB_PASSWORD,
    "database": process.env.DB_DATABASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_CONNECTION
  },
  "production": {
    "username": process.env.DB_USERNAME,
    "password": process.env.DB_PASSWORD,
    "database": process.env.DB_DATABASE,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_CONNECTION
  }
};

-1

你也可以在开发中使用 use_env_variable。我假设你已经在使用 dotenv 并且已经设置了 .env 文件,只需在其中添加以下行:

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

将 [] 中的内容替换为必要的内容,并在配置文件中将 "use_env_variable" 设置为 LOCALDB,就像你在生产环境中使用 JAWSDB 一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接