时间: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,成功。