在 .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}`));

一开始我把所有这些都推到了回购协议中,但我的应用程序已经完成,所以我正在处理未完成的事情,所以我想隐藏那个变量。

第一次尝试

我这样做是因为我尝试 gitignore 的文件已经发布到 repo,所以我必须这样做来清除它并将整个应用程序重新推送到 github ,这次居然躲/config

结果

localhost 上有效,并且文件已正确隐藏 GitHub。

但这实际上破坏了我部署的应用程序的 Heroku 版本。应用程序崩溃了。

第二次尝试

.env

MONGO_URI="mongodb+srv://name:pass@app-name.mongodb.net/test?retryWrites=true&w=majority"
JWT_SECRET="secretKey"

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 配置分开,因为通常它们会有不同的设置(开发与生产)。