nodemon文件变更/rs触发重启时报spawn EBADF崩溃
故障根因
你当前使用的nodemon 1.19.4是2019年发布的旧版本,和Node.js 18.x 存在底层API兼容问题:
旧版nodemon依赖的pstree.remy包在重启时需要查杀原有服务进程,会调用Node.js的spawn子进程接口,但Node 18调整了子进程文件描述符的校验逻辑,老版本代码没有做适配,直接触发EBADF(无效文件描述符)错误。不管是文件变更触发自动重启,还是手动输入rs触发重启,都会走到这段杀进程的逻辑,所以崩溃可以稳定复现。
日志里打印的MongoDB相关弃用警告和本次崩溃没有关系,不影响nodemon的运行逻辑。
解决方案
按优先级选以下任意一种处理即可:
- 优先升级nodemon到最新稳定版本,执行对应包管理工具的安装命令:
# npm 执行 npm install nodemon@latest --save-dev # yarn 执行 yarn add nodemon@latest --dev
新版nodemon已经完成高版本Node.js的适配,升级完成后不需要调整原有目录监听配置,自动重启、rs手动重启功能都会恢复正常。
- 如果项目有特殊依赖锁死了nodemon版本无法升级,可以将本地运行环境的Node.js版本降级到16.x及以下,旧版Node的子进程逻辑和nodemon 1.19.4匹配,不会触发该报错,但Node 16已结束官方维护,不建议长期使用该方案。
额外说明:如果后续需要清理日志里的MongoDB警告,只需要在MongoClient连接配置里加上
useNewUrlParser: true、useUnifiedTopology: true两个参数,同时将代码里调用的collection.ensureIndex方法替换为collection.createIndexes即可。
内容的提问来源于stack exchange,提问作者TheValyreanGroup
相关产品推荐
相关产品推荐

