Heroku部署Cloudinary项目报Must supply cloud_name错误寻求解决方案
问题现象
在本地.env文件中声明CLOUD_NAME、CLOUD_KEY、CLOUD_SECRET环境变量,执行git push heroku master部署项目时出现如下报错:
2022-07-14T13:21:28.836730+00:00 app[web.1]: Must supply cloud_name 2022-07-14T13:21:28.836731+00:00 app[web.1]: (Use `node --trace-uncaught ...` to show where the exception was thrown) 2022-07-14T13:21:28.976355+00:00 heroku[web.1]: Process exited with status 1 2022-07-14T13:21:29.107460+00:00 heroku[web.1]: State changed from starting to crashed 2022-07-14T13:21:43.021994+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=react-bank-mysql.herokuapp.com request_id=6d906e55-283a-4669-bc37-b66380d65ba0 fwd="49.36.100.220" dyno= connect= service= status=503 bytes= protocol=https 2022-07-14T13:21:43.334479+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=react-bank-mysql.herokuapp.com request_id=b4c0fd71-4de1-4a95-b7e9-55b86f4c697c fwd="49.36.100.220" dyno= connect= service= status=503 bytes= protocol=https 2022-07-14T13:22:36.489119+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=react-bank-mysql.herokuapp.com request_id=177b60b5-6e3d-4b33-a329-b2b87448235a fwd="49.36.100.220" dyno= connect= service= status=503 bytes= protocol=https 2022-07-14T13:22:36.778798+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=react-bank-mysql.herokuapp.com request_id=5bf1946e-68c4-4d77-85aa-54ea4ac0c873 fwd="49.36.100.220" dyno= connect= service= status=503 bytes= protocol=https
此前参考Cloudinary官方示例代码,注释了显式配置Cloudinary的代码段,同时添加了CLOUDINARY_URL环境变量,问题未解决。相关代码如下:
const cloudinary = require("cloudinary").v2; require("dotenv").config(); //Connect to Cloudinary && Folder // cloudinary.config({ // cloud_name: process.env.CLOUD_NAME, // api_key: process.env.CLOUD_KEY, // api_secret: process.env.CLOUD_SECRET, // secure: true, // });
报错原因
本地.env文件不会被Heroku部署环境自动读取。.env文件仅用于本地开发环境加载环境变量,且默认会被.gitignore排除,不会被提交到代码仓库,Heroku运行时自然拿不到你在本地.env里配置的所有Cloudinary相关参数,初始化Cloudinary时找不到cloud_name就会抛出异常,最终导致应用崩溃返回H10错误。
解决步骤
- 恢复被注释的Cloudinary显式配置代码,同时确保
dotenv的加载语句放在所有读取process.env的逻辑之前,避免环境变量未加载就执行初始化:
const cloudinary = require("cloudinary").v2; // 必须先加载dotenv配置,再调用cloudinary.config require("dotenv").config(); cloudinary.config({ cloud_name: process.env.CLOUD_NAME, api_key: process.env.CLOUD_KEY, api_secret: process.env.CLOUD_SECRET, secure: true, });
- 将Cloudinary相关环境变量配置到Heroku平台,二选一即可:
- 命令行方式:本地安装并登录Heroku CLI后,在项目目录下依次执行以下命令,替换占位符为你自己的Cloudinary密钥真实值:
heroku config:set CLOUD_NAME=你的Cloudinary cloud_name值 heroku config:set CLOUD_KEY=你的Cloudinary api_key值 heroku config:set CLOUD_SECRET=你的Cloudinary api_secret值
- 网页后台方式:登录Heroku控制台进入对应项目页,找到「Settings」选项卡,下拉到「Config Vars」板块,点击「Reveal Config Vars」,逐个添加
CLOUD_NAME、CLOUD_KEY、CLOUD_SECRET三个键值对,填写完成后保存。
- 确认项目根目录下的
.gitignore文件包含.env条目,绝对不要把本地.env文件提交到Git仓库,避免密钥泄露。 - 重新执行
git push heroku master完成部署即可。
补充:你之前尝试的
CLOUDINARY_URL方案未生效,原因也是没有把该变量配置到Heroku的Config Vars中。如果要使用该方案,需要在Heroku中添加键为CLOUDINARY_URL、值为cloudinary://<你的api_key>:<你的api_secret>@<你的cloud_name>的配置项,添加后无需写显式的cloudinary.config代码也可正常初始化,但显式配置的可读性更高,更推荐使用。
内容的提问来源于stack exchange,提问作者Shubham Singhvi
相关产品推荐
相关产品推荐

