Я пытаюсь отправить свое приложение в Heroku, но у меня возникают некоторые проблемы:
Error: ENOENT: no such file or directory, open '.env' 2019-04-10T01:38:23.050188+00:00 app[web.1]: 1 at Object.openSync (fs.js:438:3) 2019-04-10T01:38:23.050190+00:00 app[web.1]: 1 at Object.readFileSync (fs.js:343:35) 2019-04-10T01:38:23.050192+00:00 app[web.1]: 1 at Object. (/app/config/database.js:4:39)
Кажется, что ошибка - это переменная envConfig
, но она мне нужна для работы базы данных.
На данный момент я получаю
Вот мой config/database.js
:
if (!process.env.PG_DB) {
const fs = require('fs')
const dotenv = require('dotenv')
// dotenv, but i need this make the database work
const envConfig = dotenv.parse(fs.readFileSync('.env'))
for (var k in envConfig) {
process.env[k] = envConfig[k]
}
console.info('[api][sequelize] Loaded database ENV vars from .env file')
}
module.exports = {
development: {
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB,
host: process.env.POSTGRES_HOST,
dialect: 'postgres',
migrationStorageTableName: 'sequelize_meta'
},
production: {
username: "root",
password: null,
database: "*********some postgress url",
host: "127.0.0.1",
dialect: "postgres"
}
И мой app.js
:
var express = require('express');
var app = express();
var userRoute = require('./routes/users');
var postRoute = require('./routes/posts');
var bodyParser = require('body-parser');
var logger = require('morgan');
var session = require('express-session');
var cookieParser = require('cookie-parser') ;
var dotenv = require('dotenv');
var env = dotenv.config();
var cors = require('cors');
var models = require('./models/');
const port = process.env.PORT || 8000;
const passport = require('passport');
const path = require('path');
// const allowOrigin = process.env.ALLOW_ORIGIN || '*'
// CORS Middleware
if (!process.env.PORT) {
require('dotenv').config()
}
if (!process.env.PORT) {
console.info('[api][port] 8000 set as default')
console.info('[api][header] Access-Control-Allow-Origin: * set as default')
} else {
console.info('[api][node] Loaded ENV vars from .env file')
console.info(`[api][port] ${process.env.PORT}`)
console.info(`[api][header] Access-Control-Allow-Origin: ${process.env.ALLOW_ORIGIN}`)
}
require('./config/passport-github');
require('./config/passport');
app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cookieParser());
app.use(session({
secret : process.env.JWT_SECRET,
saveUninitialized: false,
maxAge: 1000 * 60 * 60 * 84,
resave: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended:false}));
const isAuthenticated = function(req, res, next){
if (req.isAuthenticated()){
next();
console.info('this works');
}else{
res.redirect('http://127.0.0.1:8001/signIn');
}
}
// app.use(function(req, res, next) {
// res.header('Access-Control-Allow-Origin', '*');
// // res.header('Access-Control-Allow-Credentials', true);
// res.header("preflightContinue", false)
// // res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
// res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
// next();
// });
app.use(cors({
'allowedHeaders': ['Content-Type'], // headers that React is sending to the API
'exposedHeaders': ['Content-Type'], // headers that you are sending back to React
'origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));
app.use('/api/users', userRoute );
app.use('/api/posts', isAuthenticated, postRoute );
app.use(function(req, res, next) {
res.locals.user = req.user; // This is the important line
// req.session.user = user
console.info(res.locals.user);
next();
});
models.sequelize.sync().then(() => {
const server = app.listen(port, () => {
console.info(`Server is up and running on port ${port}`);
});
});
Прежде чем делать что-либо еще, если это ваши настоящие учетные данные, вы должны сделать их недействительными немедленно. Они навсегда скомпрометированы, и вам нужно создать новые. Редактирование их вне вашего вопроса - недостаточно.
Ты можешь измениться
const envConfig = dotenv.parse(fs.readFileSync('.env'))
к
const envConfig = dotenv.config({silent: true})
Здесь вам не нужно читать файл вручную, а его пропуск позволяет изящно обработать случай, когда он не существует. Также нет необходимости вручную устанавливать значения в process.env
:
for (var k in envConfig) {
process.env[k] = envConfig[k]
}
Это можно вообще пропустить. Dotenv позаботится об этом сам. Поэтому вам тоже не нужно envConfig
, сводя все это к простому
dotenv.config({silent: true})
Если .env
существует, его содержимое будет добавлено к тому, что уже есть в process.env
. При разработке это дает вам удобный способ установить информацию о подключении к базе данных.
В рабочей среде .env
не должно существовать, а информация о подключении к базе данных определенно не должна быть жестко запрограммирована. Вместо этого информация о подключении к вашей базе данных должна поступать из одной или нескольких Вары конфигурации Heroku (это переменные среды, которые уже должны быть доступны через process.env
). Ваш аддон базы данных, вероятно, уже установил для вас переменную DATABASE_URL
.
Для вещей в вашем .env
, которые вы установили сами, установите переменную конфигурации Heroku для ее производственного значения. Вы можете сделать это через веб-панель Heroku или через Интерфейс командной строки Героку:
heroku config:set SOME_VARIABLE=foo
Если это ваши настоящие учетные данные, вы должны сделать их недействительными немедленно. Они навсегда скомпрометированы, и вам нужно генерировать новые. Редактирование их вне вашего вопроса - недостаточно.