工具小筆記|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
麟製所
2會員
58內容數
軟體、旅遊分享
麟製所的其他內容
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
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
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