時間:2023.12.17
問題:在開發一個 discord bot 的時候,在伺服器端遇到了
Error: Cannot find module 'readline/promises'
的錯誤。但是本地並沒有報錯。
解決過程
readline/promises
是 bot 的一個依賴 elephant-sdk 使用的庫。根據這個搜索結果,初步認為可能和 nodejs 版本有關。
檢查服務端的 nodejs 版本為 v16.19.1,懷疑是服務端的 nodejs 版本太低導致的錯誤。
root@nunti-bot:~# node -v
v16.19.1
- 通過 nvm 把 nodejs 升級到 v21.4.0。但是 bot 的錯誤仍然存在
- 嘗試最小化複現錯誤。在 Node.js REPL(交互式解釋器)中運行代碼:
const readline = require('readline/promises');
並沒有出錯。 - 單獨下載 elephant sdk,使用 npm 安裝依賴(和 bot 相同的包管理器),運行倉庫自帶的 example.ts,也可以正常運行。
- 至此有點沒有頭緒。擱置許久,晚上睡前突然間意識到之前測試的時候重啟 bot 一直依靠的是 pm2 重啟。而 pm2 很可能還是使用的舊的 nodejs 版本。為了驗證猜想,使用
pm2 show 'app-name'
查看,果然發現返回結果中其中一行:│ node.js version │ 16.19.1
。 - 根據這個搜索結果,升級 pm2 及重啟 pm2 進程:
然後再使用一遍
pm2 update pm2 restart app --update-env
pm2 show
檢查一遍,發現這次 nodejs 版本終於升級成功了。再測試一遍 bot,成功。