工具小筆記|Cloud Function 無法載入 dotenv 的解法與選擇:方法 A 與方法 B

更新 發佈閱讀 5 分鐘

🛠️ 最近在部署 LINE 機器人到 Google Cloud Functions(Gen2)時,碰到一個常見又很容易卡住的錯誤:

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'dotenv' imported from /workspace/xxx.js

其實這是因為我在本機使用 .env 開發環境變數,但部署到 GCP 時沒有處理好 dotenv 套件的使用方式。


✅ 問題情境

在本地開發的時候,我透過 dotenv 載入 .env 檔案,來讀取 API 金鑰與環境設定。但部署到 GCP Cloud Functions(Gen 2)後,卻出現 container health check 失敗、container exit(1) 等錯誤訊息。

檢查 log 發現是:

Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'dotenv'

🧭 解法比較:方法 A vs 方法 B

🔹 方法 A:安裝 dotenv 套件(推薦)

npm install dotenv --save

然後在你的入口檔案(例如 secretManager.jsindex.js)中這樣寫:

import 'dotenv/config';

優點:

  • 簡單、通用,在本機、GCP、其他平台都能運行。
  • 不用改程式邏輯,.env 在本地、環境變數在 GCP,各自運作。

缺點:

  • 正式環境會多載入 dotenv,但實際上不影響效能或安全。

🔹 方法 B:僅在本地載入 dotenv

// secretManager.js
if (!process.env.K_SERVICE) {
const { default: dotenv } = await import('dotenv');
dotenv.config();
}

優點:

  • 正式環境不會額外載入不需要的套件。
  • 更「乾淨」,遵循 12 Factor App。

缺點:

  • 較難理解與維護,需額外判斷條件。
  • 若將來轉移到非 GCP 平台,條件式判斷要再調整。

🧪 實用的檢查與排錯指令

✅ 部署指令(可一行執行):

gcloud functions deploy line-bot-gemini-node-js-dev --gen2 --runtime=nodejs20 --region=asia-east1 --source=. --entry-point=lineWebhook --trigger-http --allow-unauthenticated --set-env-vars=NODE_ENV=development,GOOGLE_MAPS_API_KEY=xxx,GOOGLE_CLOUD_PROJECT_ID=souvenir-ai-assistant-dev

🔍 查看最新失敗 log:

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=line-bot-gemini-node-js-dev" --project=souvenir-ai-assistant-dev --limit=50 --format="value(textPayload)"

找 Cannot find package 'dotenv' 或 exit(1) 是常見錯誤關鍵字。

🌐 開放公開存取權限(如 webhook 需要 LINE 打得進來):

gcloud functions add-iam-policy-binding line-bot-gemini-node-js-dev --region=asia-east1 --member="allUsers" --role="roles/cloudfunctions.invoker"

🚀 我最後選了哪個?

我選擇 方法 A,因為:

  • 我希望未來能將這支 bot 搬到其他雲端平台或本地伺服器。
  • 用 dotenv 管理 .env.dev / .env.prod 對我來說更方便。
  • 開發效率為主,少一個坑卡自己!

💬 如果你也踩過這個坑...

歡迎留言分享你的做法或部署心得,也可以收藏這篇當作未來部署 LINE bot 的小抄 ✨

或者你現在就遇到 exit(1) 問題,不妨先檢查一下你是不是用了 dotenv 卻沒安裝它 😅

留言
avatar-img
留言分享你的想法!
avatar-img
麟幻的沙龍
2會員
16內容數
軟體、旅遊分享
麟幻的沙龍的其他內容
2025/10/09
常常因為通勤太累不小心睡過頭,結果一醒來已經坐過站?或是滑手機太專心,錯過了要下車的時間? 這些小麻煩,讓我決定動手做一個「台鐵智慧到站提醒」功能,直接整合到 LINE Bot。從此搭車就能更安心,不用再緊張盯著站名看。 到站提醒是什麼? 簡單說,它是一個 智慧型的台鐵搭車小助手,會自動幫你
2025/10/09
常常因為通勤太累不小心睡過頭,結果一醒來已經坐過站?或是滑手機太專心,錯過了要下車的時間? 這些小麻煩,讓我決定動手做一個「台鐵智慧到站提醒」功能,直接整合到 LINE Bot。從此搭車就能更安心,不用再緊張盯著站名看。 到站提醒是什麼? 簡單說,它是一個 智慧型的台鐵搭車小助手,會自動幫你
2025/10/07
一個簡潔好用的 PHP 套件,專門用於民國和西元日期的轉換,解決開發者在處理臺灣日期格式時的痛點。支援常見日期格式,透過 Composer 安裝,一行指令即可導入使用,大幅提升開發效率。
2025/10/07
一個簡潔好用的 PHP 套件,專門用於民國和西元日期的轉換,解決開發者在處理臺灣日期格式時的痛點。支援常見日期格式,透過 Composer 安裝,一行指令即可導入使用,大幅提升開發效率。
2025/09/23
最近在整理一些以 Notion 為主的觀影記錄,想要自動化處理資料,例如: 自動取得所有紀錄 做一些統計或轉為 CSV 日後串接 AI 做描述生成或影片推薦 但 Notion 的網頁操作不適合大量處理資料,我決定用熟悉的 Google Apps Script 來串接 Notion API,從
2025/09/23
最近在整理一些以 Notion 為主的觀影記錄,想要自動化處理資料,例如: 自動取得所有紀錄 做一些統計或轉為 CSV 日後串接 AI 做描述生成或影片推薦 但 Notion 的網頁操作不適合大量處理資料,我決定用熟悉的 Google Apps Script 來串接 Notion API,從
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
首先確定VS Code的版本,如果你的版本跟我一樣是1.92.0那麼你可以參考我的作法...
Thumbnail
首先確定VS Code的版本,如果你的版本跟我一樣是1.92.0那麼你可以參考我的作法...
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
透過 No Code 工具建立「 LINE 檔案備份機器人」,未來在 LINE 群組傳送檔案,機器人會自動儲存檔案至 Google 雲端,不必擔心超過檔案存取期限無法下載。更能將不同 LINE 群組的檔案分別儲存至對應雲端資料夾,檔案管理更方便!除了檔案,也可以自動將「圖片」儲存至雲端!
Thumbnail
透過 No Code 工具建立「 LINE 檔案備份機器人」,未來在 LINE 群組傳送檔案,機器人會自動儲存檔案至 Google 雲端,不必擔心超過檔案存取期限無法下載。更能將不同 LINE 群組的檔案分別儲存至對應雲端資料夾,檔案管理更方便!除了檔案,也可以自動將「圖片」儲存至雲端!
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Cloud Run 允許您指定哪些修訂版應該接收流量,並指定不同版本接收的流量比例。Revisions 也能使您能夠回滾到先前的版本、逐步增加新版本的流量比例,或在多個修訂版之間拆分流量。
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
Google 提供了免費的雲端服務 Google Apps Script (GAS) ,我們可以撰寫一些簡易的程式APP,串接其他 Google 雲端服務 如 Google Docs ,Sheets …,就能夠幫助我們利用雲端硬碟做日常工作
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
Thumbnail
在本篇文章中,將會設定 Cloud Run,以便每當將程式修改並推送到 GitHub 時,它都會使用 Cloud Build 自動構建和部署應用程序的最新版本。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News