Heroku错误:ENOENT:没有该文件或目录,打开“。env”

5
我正在尝试将我的应用程序推送到Heroku,但遇到了一些问题:

错误: ENOENT: 没有这样的文件或目录,打开'.env' 2019-04-10T01:38:23.050188+00:00 app[web.1]: 1 在 Object.openSync (fs.js:438:3) 2019-04-10T01:38:23.050190+00:00 app[web.1]: 1 在 Object.readFileSync (fs.js:343:35) 2019-04-10T01:38:23.050192+00:00 app[web.1]: 1 在 Object. (/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}`);
  });
});

如果那些是您真实的凭据,您应立即使其无效。它们永远被泄露了,您需要生成新的凭据。仅从问题中编辑它们是不够的。 - Chris
1个回答

6

在您进行任何其他操作之前,如果那些是您的真实凭证,您应立即使其失效。它们永远不安全,您需要生成新的凭证。将其从问题中编辑出来不足够


你可以更改

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 Web仪表板或Heroku CLI执行此操作:
heroku config:set SOME_VARIABLE=foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接