Crontab Node.js 讀取不到 dotenv 路徑的解決辦法

最近在伺服器上遇到一個很奇怪的問題,不管怎麼寫就是沒辦法讀取到 .env 的環境設定,後來想到的解決辦法。

Crontab Node.js 讀取不到 dotenv 路徑的解決辦法

在伺服器上經常會使用 dotenv 這個套件,來讀取一些環境變數,在管理跟安全性上是有很大的幫助。

最近在伺服器上遇到一個很奇怪的問題,不管怎麼寫就是沒辦法讀取到 .env 的環境設定,指定絕對路徑這種方法也是有點蠢、又或是叫你乾脆把環境變數寫在 crontab 內這種不太妥當的方法,查了半天也沒有查出原因。

直到看到 stackoverflow 上有人建議說你可以寫

console.log(require("dotenv"));

方便 deubg 可以省下你很多時間,這個時候就很有趣了,我在 log 上的錯誤訊息一直看到 node 一直想要讀取我家目錄的 .env 檔案 /home/jimmy8646/.env 這個路徑,這也是為什麼一直讀取不到 .env 的原因了,解決辦法有點土砲,可是很管用。

解決方法

改寫讀取路徑的方法

const currentPath = process.cwd();
console.log(require("dotenv").config({ path: currentPath + "/.env" }));

crontab 改寫成先到專案路徑底下,在使用 node 執行

0 22 * * * cd /your/project/path && /usr/local/bin/node /your/project/path/index.js > /tmp/cronjob.log 2>&1

原因是 process.cwd() 可讀取到你當下的所在目錄,這樣 cd 到專案目錄底下,就可以拿到整個專案的絕對路徑,所以在讀取 .env 問題也可以解決了。在本地開發的時候也不會有任何的影響真的是太棒了!