Crontab Node.js 讀取不到 dotenv 路徑的解決辦法
最近在伺服器上遇到一個很奇怪的問題,不管怎麼寫就是沒辦法讀取到 .env 的環境設定,後來想到的解決辦法。
在伺服器上經常會使用 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
問題也可以解決了。在本地開發的時候也不會有任何的影響真的是太棒了!