将应用程序部署到 Heroku,ENV 变量不起作用
Posted
技术标签:
【中文标题】将应用程序部署到 Heroku,ENV 变量不起作用【英文标题】:Deploying app to Heroku, ENV variables not wokring 【发布时间】:2021-07-06 08:53:09 【问题描述】:我最近将我的 node js 应用程序部署到 Heroku,但在让我的应用程序运行时遇到了一些问题。我的应用程序加载但当我尝试登录时它会中断。据我所知,环境变量由于某种原因没有正确加载。 db 变量是从我的 .ENV 文件中获取的字符串,是用于连接到 mongo db 的 Monogo URI。出于某种原因,当 heroku 运行它时 process.env.MongoURI 是未定义的。有人知道为什么会这样吗?
我得到的具体错误是。
错误
MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". Make sure the first parameter to `mongoose.connect()` or `mongoose.createConnection()` is a string.
App.js
/* eslint-disable no-unused-vars */
/* eslint-disable comma-dangle */
/* eslint-disable no-console */
/* eslint-disable arrow-parens */
const createError = require('http-errors');
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const dotenv = require('dotenv');
dotenv.config();
const indexRouter = require('./server/index');
const port = process.env.PORT || 3000;
const app = express();
require('./server/config/passport')(passport);
// DB Config
const db = process.env.MongoURI;
mongoose.connect(db, useNewUrlParser: true, useUnifiedTopology: true ) // I beleieve this is the line that is breaking the code.
.then(() => console.log('MONGODB Connected'); )
.catch(err => console.log(err));
app.use(expressLayouts);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded( extended: false ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session(
secret: 'secret',
resave: true,
saveUninitialized: true
));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use((req, res, next) =>
res.locals.success_msg = req.flash('success_msg');
res.locals.error_msg = req.flash('error_msg');
res.locals.error = req.flash('error');
next();
);
app.use('/', indexRouter);
// catch 404 and forward to error handler
app.use((req, res, next) =>
next(createError(404));
);
// error handler
app.use((err, req, res, next) =>
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : ;
// render the error page
res.status(err.status || 500);
res.render('error');
);
app.listen(port, () =>
console.log(`Running on port $port`);
);
module.exports = app;
【问题讨论】:
【参考方案1】:您可能应该为此使用 Heroku 内置的环境变量编辑器。
【讨论】:
是的! Vercel 和其他托管服务也是如此。即使有.env
,我们也必须在其内置的环境编辑器中配置环境变量。
@AjitKumar 我刚刚了解了 Heroku Dashboard 中的内置配置变量,基本上我只需将所有 .env 变量放在那里,然后我可以在代码中引用它们,我如何使用 dotenv .在 Heroku 中拥有私有变量对我来说似乎有点不安全。【参考方案2】:
首先,确保您的.env
已添加到您的.gitignore
文件中。当您将项目部署到 heroku 时,它将自动适应其新主机上的变量。
查找更多:https://devcenter.heroku.com/articles/node-best-practices#be-environmentally-aware
【讨论】:
这也是我在部署之前在文档中看到的,这也是我所期待的行为。我的 gitignore 已经包含了我的 env 文件。以上是关于将应用程序部署到 Heroku,ENV 变量不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上部署 Django 应用程序:我可以在 .env 文件中手动设置环境变量吗?我需要安装 autoenv、heroku-config 等工具吗?