在 .env 中隐藏我的 MongoURI 变量会破坏我在 Heroku 上的应用程序
Hiding my MongoURI variable in .env breaks my app on Heroku
我需要这方面的帮助。
我的原始设置暴露了我的 mongoURI。
我有一个名为 config
的根文件夹,其中有一个名为 default.json
的文件
default.json
{
"mongoURI": "mongodb+srv://name:pass@app-name.mongodb.net/test?retryWrites=true&w=majority",
"jwtSecret": "secretKey"
}
我在 /server.js
中使用了那个 mongoURI
变量
server.js
const mongoose = require('mongoose');
const express = require('express');
const app = express();
const config = require('config'); // <<~~ to access /config dir
const cors = require('cors');
const path = require('path');
// Middleware
app.use(express.json());
// DB Config
// You can get all your config/ values with config.get('')
const db = config.get('mongoURI'); // <<~~ access mongoURI var
// Connect to MongoDB
mongoose
.connect(process.env.URI || db, { // <<~~ use mongoURI var
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
.then(() => console.log("Connected to MongoDB.."))
.catch(err => console.log(err));
// Available Routes
const tournaments = require('./routes/api/tournaments');
const users = require('./routes/api/users');
// Use Routes
app.use(cors());
app.use('/tournaments', tournaments);
app.use('/users', users);
// For Heroku deployment
if(process.env.NODE_ENV === 'production') {
app.use(express.static(path.join(__dirname, 'client', 'build')));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
});
};
// Run Server
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server started on port: ${port}`));
一开始我把所有这些都推到了回购协议中,但我的应用程序已经完成,所以我正在处理未完成的事情,所以我想隐藏那个变量。
第一次尝试
- 我把/config目录放在
.gitignore
- 运行
git rm -rf --cached .
- 运行
git add .
我这样做是因为我尝试 gitignore
的文件已经发布到 repo,所以我必须这样做来清除它并将整个应用程序重新推送到 github ,这次居然躲/config
结果
在 localhost
上有效,并且文件已正确隐藏 GitHub。
但这实际上破坏了我部署的应用程序的 Heroku 版本。应用程序崩溃了。
第二次尝试
- 还原了该更改
- 已安装
dotenv
库
- 创建了一个文件
.env
并设置了我的变量:
.env
MONGO_URI="mongodb+srv://name:pass@app-name.mongodb.net/test?retryWrites=true&w=majority"
JWT_SECRET="secretKey"
- 在
server.js
中替换了对 /config
的调用以利用这个新的 ENV 设置:
server.js
const mongoose = require('mongoose');
const express = require('express');
const app = express();
// const config = require('config'); // <<~~removed this
const cors = require('cors');
const path = require('path');
const dotenv = require('dotenv'); // <<~~new line
// Middleware
app.use(express.json());
// DB Config
// You can get all your config/ values with config.get('')
// const db = config.get('mongoURI'); // <<~~removed this
dotenv.config(); <<~~new line
const url = process.env.MONGO_URI; <<~~new line
// Connect to MongoDB
mongoose
.connect(url, { <<~~tried this way
.connect(process.env.URI || url, { <<~~and this way
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
.then(() => console.log("Connected to MongoDB.."))
.catch(err => console.log(err));
// Available Routes
const tournaments = require('./routes/api/tournaments');
const users = require('./routes/api/users');
// Use Routes
app.use(cors());
app.use('/tournaments', tournaments);
app.use('/users', users);
// For Heroku deployment
if(process.env.NODE_ENV === 'production') {
app.use(express.static(path.join(__dirname, 'client', 'build')));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
});
};
// Run Server
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server started on port: ${port}`));
结果
在 localhost
、
上工作正常
Heroku 应用程序正常启动,
但该应用未访问来自 mongodb 的数据。
我不确定我做错了什么。抱歉冗长 post。帮助!感谢
最好仅将 .env
用于本地开发并将其添加到 .gitignore
以避免推送到源存储库。
定义与 Config Vars 相同的本地环境变量:这可以通过 Heroku CLI 或在 Heroku 仪表板(Web UI)中完成。部署后,您的应用程序可以像在本地一样访问 env 变量(即使用 process.env.DATABASE_URL 访问 DATABASE_URL 配置变量)。
这也有助于将本地开发与 Heroku 配置分开,因为通常它们会有不同的设置(开发与生产)。
我需要这方面的帮助。
我的原始设置暴露了我的 mongoURI。
我有一个名为 config
的根文件夹,其中有一个名为 default.json
default.json
{
"mongoURI": "mongodb+srv://name:pass@app-name.mongodb.net/test?retryWrites=true&w=majority",
"jwtSecret": "secretKey"
}
我在 /server.js
mongoURI
变量
server.js
const mongoose = require('mongoose');
const express = require('express');
const app = express();
const config = require('config'); // <<~~ to access /config dir
const cors = require('cors');
const path = require('path');
// Middleware
app.use(express.json());
// DB Config
// You can get all your config/ values with config.get('')
const db = config.get('mongoURI'); // <<~~ access mongoURI var
// Connect to MongoDB
mongoose
.connect(process.env.URI || db, { // <<~~ use mongoURI var
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
.then(() => console.log("Connected to MongoDB.."))
.catch(err => console.log(err));
// Available Routes
const tournaments = require('./routes/api/tournaments');
const users = require('./routes/api/users');
// Use Routes
app.use(cors());
app.use('/tournaments', tournaments);
app.use('/users', users);
// For Heroku deployment
if(process.env.NODE_ENV === 'production') {
app.use(express.static(path.join(__dirname, 'client', 'build')));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
});
};
// Run Server
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server started on port: ${port}`));
一开始我把所有这些都推到了回购协议中,但我的应用程序已经完成,所以我正在处理未完成的事情,所以我想隐藏那个变量。
第一次尝试
- 我把/config目录放在
.gitignore
- 运行
git rm -rf --cached .
- 运行
git add .
我这样做是因为我尝试 gitignore
的文件已经发布到 repo,所以我必须这样做来清除它并将整个应用程序重新推送到 github ,这次居然躲/config
结果
在 localhost
上有效,并且文件已正确隐藏 GitHub。
但这实际上破坏了我部署的应用程序的 Heroku 版本。应用程序崩溃了。
第二次尝试
- 还原了该更改
- 已安装
dotenv
库 - 创建了一个文件
.env
并设置了我的变量:
.env
MONGO_URI="mongodb+srv://name:pass@app-name.mongodb.net/test?retryWrites=true&w=majority"
JWT_SECRET="secretKey"
- 在
server.js
中替换了对/config
的调用以利用这个新的 ENV 设置:
server.js
const mongoose = require('mongoose');
const express = require('express');
const app = express();
// const config = require('config'); // <<~~removed this
const cors = require('cors');
const path = require('path');
const dotenv = require('dotenv'); // <<~~new line
// Middleware
app.use(express.json());
// DB Config
// You can get all your config/ values with config.get('')
// const db = config.get('mongoURI'); // <<~~removed this
dotenv.config(); <<~~new line
const url = process.env.MONGO_URI; <<~~new line
// Connect to MongoDB
mongoose
.connect(url, { <<~~tried this way
.connect(process.env.URI || url, { <<~~and this way
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
.then(() => console.log("Connected to MongoDB.."))
.catch(err => console.log(err));
// Available Routes
const tournaments = require('./routes/api/tournaments');
const users = require('./routes/api/users');
// Use Routes
app.use(cors());
app.use('/tournaments', tournaments);
app.use('/users', users);
// For Heroku deployment
if(process.env.NODE_ENV === 'production') {
app.use(express.static(path.join(__dirname, 'client', 'build')));
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'client', 'build', 'index.html'))
});
};
// Run Server
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server started on port: ${port}`));
结果
在 localhost
、
Heroku 应用程序正常启动,
但该应用未访问来自 mongodb 的数据。
我不确定我做错了什么。抱歉冗长 post。帮助!感谢
最好仅将 .env
用于本地开发并将其添加到 .gitignore
以避免推送到源存储库。
定义与 Config Vars 相同的本地环境变量:这可以通过 Heroku CLI 或在 Heroku 仪表板(Web UI)中完成。部署后,您的应用程序可以像在本地一样访问 env 变量(即使用 process.env.DATABASE_URL 访问 DATABASE_URL 配置变量)。
这也有助于将本地开发与 Heroku 配置分开,因为通常它们会有不同的设置(开发与生产)。