#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