using an enviroment variable for local sequelize configuration

佐手、 提交于 2021-02-06 02:26:50

问题


I'm looking to use an environment variable inside of the config.json file of my project using sequelize. I'm using dotenv to set environment variables locally. My config.json file looks like this

{
  "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"
  }
}

The issue I'm having is that I can't use variables inside the config.json file. It looks like for production I can use the "use_env_varable" key and use the env variable for my connection string. So I guess I either need a way to figure out the combined connection string for my local mysql db or a way to use variables inside the config.json. Any solutions?


回答1:


you should change config.json file to a config.js module and make sure to require the dotenv at the very top.

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"
}
};

NOTE: update your .sequelizerc file to match the new config file.

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



回答2:


I worked on this for quite a bit. I do not know why Sequelize does not use production when it is literally in the environment if you run heroku run bash. I was able to get it working by modifying the Sequelize object depending on the JAWSDB_URL, not the NODE_ENV.

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:


Assuming you're using Passport, Sequelize, MySql:

On the index.js file setup through sequelize, look for this line:

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

Try changing it to:

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

Your .env should have:

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

Last, depending on how your passport strategy is setup, look for something that says:

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

You are going to need to place the: database:process.env.DB_DATABASE

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

This means that you should remove that key:value from the config.json.

It should be good to go and you will not have to convert anything. Sequelize will take care of all of that.




回答4:


you can use the use_env_variable for development too. you already seem to be using dotenv, so im assuming you have a .env file already setup. just add this line to it:

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

replace the stuff in [] as necessary, and in your config file set "use_env_variable" to LOCALDB, just like how you have JAWSDB for production.



来源:https://stackoverflow.com/questions/38757728/using-an-enviroment-variable-for-local-sequelize-configuration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!