部署含JawsDB MySQL的项目到Heroku时.env文件失效如何解决
问题根因与修复方案
你混淆了标准.env环境变量文件和Node.js配置模块的语法,同时存在配置逻辑冲突、拼写错误、属性名错误三类问题,按以下步骤修改即可:
1. 修正文件类型错误(核心问题)
标准.env文件是纯键值对格式,不能写Node.js的require、module.exports等JS语法,你目前把.env写成了Node配置模块,直接导致解析报错。
正确的.env文件内容:
# 仅写键值对,每一行一个变量,不要加逗号、引号等多余符号 DB_HOST=qao3ibsa7hhgecbv.cbetxkdyhwsb.us-east-1.rds.amazonaws.com DB_USER=dbuser DB_PASSWORD=dbpassword DB_PORT=3306 DB_DATABASE=dbname AUTH_SECRET=myauthsecret
2. 新增Node配置模块(单独存放导出逻辑)
你之前把导出逻辑写在了.env里,现在单独新建一个config.js文件存公共配置,内容如下:
require('dotenv').config(); module.exports = { authSecret: process.env.AUTH_SECRET, db: { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, port: process.env.DB_PORT, database: process.env.DB_DATABASE } }
注意:你之前写的module.expots是拼写错误,正确写法是module.exports
3. 修正knexfile.js配置
你之前的配置同时引用了导入的db对象和process.env,且连接属性名错误(MySQL连接需要的是host不是mysqlhost,用户名属性是user不是username),修改后内容:
const { db } = require('./config'); module.exports = { client: 'mysql2', connection: db, pool: { min: 2, max: 10 }, migrations: { tableName: 'knex_migrations' } };
如果需要保留process.env的写法,也可以简化为:
require('dotenv').config(); module.exports = { client: 'mysql2', connection: { host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, port: process.env.DB_PORT, database: process.env.DB_DATABASE }, pool: { min: 2, max: 10 }, migrations: { tableName: 'knex_migrations' } };
4. 其他配套修改
- 之前引用
.env里的authSecret的地方,全部改为引用config.js里导出的authSecret即可 - Heroku平台端不需要上传
.env文件,直接在Heroku后台的「Settings」-「Config Vars」里把上面.env里的所有键值对逐一添加,平台会自动注入到运行环境的process.env中
内容的提问来源于stack exchange,提问作者user11240162
相关产品推荐
相关产品推荐

