Saltad

Saltad

【錯誤日誌】由於pm2進程的nodejs版本落後導致的錯誤

時間:2023.12.17

問題:在開發一個 discord bot 的時候,在伺服器端遇到了
Error: Cannot find module 'readline/promises' 的錯誤。但是本地並沒有報錯。

解決過程

  1. readline/promises 是 bot 的一個依賴 elephant-sdk 使用的庫。根據這個搜索結果,初步認為可能和 nodejs 版本有關。

檢查服務端的 nodejs 版本為 v16.19.1,懷疑是服務端的 nodejs 版本太低導致的錯誤。

root@nunti-bot:~# node -v
v16.19.1

  1. 通過 nvm 把 nodejs 升級到 v21.4.0。但是 bot 的錯誤仍然存在
  2. 嘗試最小化複現錯誤。在 Node.js REPL(交互式解釋器)中運行代碼:
    const readline = require('readline/promises');
    並沒有出錯。
  3. 單獨下載 elephant sdk,使用 npm 安裝依賴(和 bot 相同的包管理器),運行倉庫自帶的 example.ts,也可以正常運行。
  4. 至此有點沒有頭緒。擱置許久,晚上睡前突然間意識到之前測試的時候重啟 bot 一直依靠的是 pm2 重啟。而 pm2 很可能還是使用的舊的 nodejs 版本。為了驗證猜想,使用 pm2 show 'app-name' 查看,果然發現返回結果中其中一行:│ node.js version │ 16.19.1
  5. 根據這個搜索結果,升級 pm2 及重啟 pm2 進程:
    pm2 update
    pm2 restart app --update-env
    
    然後再使用一遍 pm2 show檢查一遍,發現這次 nodejs 版本終於升級成功了。再測試一遍 bot,成功。
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。