Ошибка Heroku: ENOENT: нет такого файла или каталога, откройте ‘.env’

#javascript #node.js #express #heroku

#javascript #node.js #выразить #heroku

Вопрос:

Я пытаюсь отправить свое приложение в 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 в 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.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:

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


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

 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 config var для его производственного значения. Вы можете сделать это через веб-панель управления Heroku или через интерфейс командной строки Heroku:

 heroku config:set SOME_VARIABLE=foo