時間:2023.12.17
問題:discord ボットの開発中に、サーバーサイドでError: Cannot find module 'readline/promises'
のエラーが発生しましたが、ローカルではエラーが発生しません。
解決手順
readline/promises
はボットの依存関係である elephant-sdk が使用しているライブラリです。この検索結果によると、おそらく nodejs のバージョンに関連している可能性があります。
サーバーサイドの nodejs のバージョンを確認しましたが、v16.19.1 でした。エラーはバージョンが低すぎることが原因かもしれません。
root@nunti-bot:~# node -v
v16.19.1
- nvm を使用して nodejs を v21.4.0 にアップグレードしましたが、ボットのエラーはまだ解決されていません。
- エラーを最小限にするために、Node.js REPL(対話型インタプリタ)で次のコードを実行しました:
const readline = require('readline/promises');
エラーは発生しませんでした。 - elephant sdk を個別にダウンロードし、npm を使用して依存関係をインストールしました(ボットと同じパッケージマネージャー)。リポジトリに付属している example.ts を実行しても正常に動作します。
- これまでのところ手がかりがありません。しばらく放置していたが、夜寝る前に以前のテストでボットを再起動するために pm2 を使用していたことに気づきました。そして、おそらく pm2 は古い nodejs のバージョンを使用している可能性があります。仮説を検証するために、
pm2 show 'app-name'
を使用して確認しました。結果の中で次の行を見つけました:│ node.js version │ 16.19.1
。 - この検索結果に基づいて、pm2 をアップグレードしてプロセスを再起動しました:
その後、
pm2 update pm2 restart app --update-env
pm2 show
を再度使用して確認しました。今回は nodejs のバージョンが正常にアップグレードされていることがわかりました。ボットを再度テストしたところ、成功しました。