Скрытие моей переменной MongoURI в .env нарушает работу моего приложения на Heroku

#reactjs #mongodb #heroku #mern #dotenv

#reactjs #mongodb #heroku #мерн #dotenv

Вопрос:

Мне нужна помощь в этом.

Моя первоначальная настройка раскрыла мой mongoURI.

У меня была вызвана корневая папка config , в которой был файл с именем default.json

default.json

 {
  "mongoURI": "mongodb srv://name:pass@app-name.mongodb.net/test?retryWrites=trueamp;w=majority",
  "jwtSecret": "secretKey"
}
 

Я использовал эту mongoURI переменную в /server.js

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 , уже был опубликован в репозитории, поэтому мне пришлось сделать это, чтобы очистить его и повторно отправить все приложение на github, на этот раз фактически скрыв /config

Результат

Это сработало localhost , и файл был правильно скрыт от GitHub.

НО это фактически нарушило мою развернутую версию приложения Heroku. Приложение сломалось.

Вторая попытка

  • Отменил это изменение
  • Установленная dotenv библиотека
  • Создал файл .env и установил мои переменные:

.env

 MONGO_URI="mongodb srv://name:pass@app-name.mongodb.net/test?retryWrites=trueamp;w=majority"
JWT_SECRET="secretKey"
 
  • Заменил вызов на /config in server.js , чтобы использовать эту новую настройку 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.

Я не уверен, что я сделал не так. Извините за длинный пост. Помогите! И спасибо

Ответ №1:

Рекомендуется использовать .env только для локальной разработки и добавлять ее .gitignore , чтобы избежать перехода в исходный репозиторий.

Определите те же локальные переменные env, что и переменные конфигурации: это можно сделать с помощью командной строки Heroku или на панели инструментов Heroku (веб-интерфейс). После развертывания ваше приложение может получить доступ к переменным env, как вы делаете локально (т.е. Получить доступ к DATABASE_URL config var с помощью process.env.DATABASE_URL).

Это также удобно для отделения вашего локального разработчика от вашей конфигурации Heroku, поскольку обычно у них будут разные настройки (dev vs prod).

Комментарии:

1. Простите меня .. спасибо. Я забыл включить это, но я уже установил эти переменные конфигурации на heroku, и это не сработало. Но я попробовал еще раз и удалил «кавычки» из значений, и теперь приложение успешно получает данные. Спасибо! Выбрал ваш ответ