Saltad

Saltad

【bug日志】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,成功。
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。