Heroku Ошибка: ENOENT: нет такого файла или каталога, откройте «.env» - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь отправить свое приложение в Heroku, но у меня возникают некоторые проблемы:

Ошибка: ENOENT: нет такого файла или каталога, откройте «.env» 2019-04-10T01: 38: 23.050188 + 00: 00 приложение [web.1]: 1 в Object.openSync (fs.js: 438: 3) 2019-04-10T01: 38: 23.050190 + 00: 00приложение [web.1]: 1 в Object.readFileSync (fs.js: 343: 35) 2019-04-10T01: 38: 23.050192 + 00: 00 приложение [web.1]: 1 на объекте.(/app/config/database.js:4:39)

Кажется, что ошибка является переменной envConfig, но она мне нужна для работы базы данных.

На данный момент я получаю

enter image description here

Вот мой 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.log('[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.log('[api][port] 8000 set as default')
  console.log('[api][header] Access-Control-Allow-Origin: * set as default')
} else {
  console.log('[api][node] Loaded ENV vars from .env file')
  console.log(`[api][port] ${process.env.PORT}`)
  console.log(`[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.log('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.log(res.locals.user);
  next();
});
models.sequelize.sync().then(() => {
  const server = app.listen(port, () => {
    console.log(`Server is up and running on port ${port}`);
  });
});

1 Ответ

1 голос
/ 10 апреля 2019

Прежде чем делать что-либо еще, если это ваши настоящие учетные данные, вы должны сделать их недействительными немедленно .Они навсегда скомпрометированы, и вам нужно создавать новые.Редактировать их из вашего вопроса недостаточно .


Вы можете изменить

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 не должно существовать, а информация о соединении с вашей базой данных определенно не должна быть сложной-coded.Вместо этого информация о соединении с вашей базой данных должна поступать из одной или нескольких конфигурационных переменных Heroku (это переменные среды, которые уже должны быть доступны через process.env).Ваш аддон базы данных, вероятно, уже установил для вас переменную DATABASE_URL.

Для вещей в вашем .env, которые вы установили самостоятельно, установите конфигурационную переменную Heroku для ее производственного значения.Вы можете сделать это через веб-панель Heroku или через Heroku CLI :

heroku config:set SOME_VARIABLE=foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...