#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
inserver.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, и это не сработало. Но я попробовал еще раз и удалил «кавычки» из значений, и теперь приложение успешно получает данные. Спасибо! Выбрал ваш ответ