我希望使用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 中的变量的方法。有什么解决办法吗?
您应该将
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'),
我在这方面花了相当多的时间。我不知道为什么 Sequelize 在运行
heroku run bash
时不使用生产环境。我能够通过根据 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));
})
在根目录下创建一个.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),
},
},
之后运行迁移和播种机。
假设您使用 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 将处理所有这一切。
这是我的 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
}
};
在项目根目录下创建.env文件
第01步: 将 config/config.json 重命名为 config/config.js (将Json文件更改为javaScript文件)
require('dotenv').config();
module.exports = {
"development": {
username :process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
host : process.env.DB_HOST,
"dialect": "mysql"
},
"production": {
username :process.env.PRO_DB_USERNAME,
password: process.env.PRO_DB_PASSWORD,
database: process.env.PRO_DB_NAME,
host : process.env.PRO_DB_HOST,
"dialect": "mysql"
}
}
STEP 02: 在项目根目录中创建 .sequelizerc 文件 (打开 .sequelizerc 文件并粘贴到下面的代码块)
const path = require('path');
module.exports = {
'config' : path.resolve('database/config','config.js'),
'models-path' : path.resolve('database','models'),
'migrations-path' : path.resolve('database','migrations'),
}
注意:我删除了 Seeder 文件夹,这就是为什么我没有提到 播种机路径
path.resolve(argument1 , argument2)函数有两个参数。
参数1是续集初始化的文件夹名称 参数 2 是初始化文件夹中的特定子文件夹
第03步:打开models文件夹index.js文件
const config = require(__dirname + '/../config/config.js')[env];
将文件扩展名 config/config.json 更改为 config/config.js
最后将数据库详细信息添加到.env文件中并使用sequelize-cli迁移注释
黑客快乐❤
您也可以使用 use_env_variable 进行开发。您似乎已经在使用 dotenv,所以我假设您已经设置了 .env 文件。只需添加这一行即可:
LOCALDB=mysql://[用户]:[密码]@[sqldomain]/[数据库名称]
根据需要替换 [] 中的内容,并在配置文件中将“use_env_variable”设置为 LOCALDB,就像用于生产的 JAWSDB 一样。