升级Node.js v12至v14后skipper-gridfs无法正常工作求助
我之前帮朋友排查过几乎一模一样的问题——Node.js v14和旧版skipper-gridfs依赖的MongoDB驱动不兼容,会出现这种「假上传」的情况:看似上传完成、文件描述符也生成了,但实际GridFS里根本没写入文件数据,导致下载时报错找不到文件。结合你的场景,给你几个可行的解决方向:
1. 升级skipper-gridfs并检查MongoDB驱动版本
旧版skipper-gridfs(比如v0.7.x及更早)依赖的MongoDB驱动大多是3.0.x左右的版本,这个版本对Node.js v14的兼容性很差。先执行命令查看当前依赖版本:
npm list skipper-gridfs mongodb
如果发现MongoDB驱动版本低于3.6.x,先尝试升级skipper-gridfs到最新稳定版:
npm install skipper-gridfs@latest --save
升级后再重新检查MongoDB驱动版本,确保它在3.6.x及以上(这个版本开始完全支持Node.js v14)。
2. 强制升级MongoDB驱动(若skipper-gridfs未自动更新)
有些时候,skipper-gridfs的最新版可能依然依赖旧版MongoDB驱动,这时可以用npm的overrides(npm 8+)或者yarn的resolutions强制指定兼容的驱动版本。在你的package.json里添加:
"overrides": { "skipper-gridfs": { "mongodb": "^3.7.3" } }
然后重新安装依赖:
npm install
3.7.3版本的MongoDB驱动既兼容Node.js v14,也能和skipper-gridfs稳定配合。
3. 修正下载代码里的Buffer构造问题
你的下载代码中使用了new Buffer(file),Node.js v14已经标记这个构造函数为弃用,虽然不会直接引发当前问题,但可能带来隐性风险,建议改成:
res.send(Buffer.from(file));
4. 验证GridFS中的实际数据
上传完成后,可以用MongoDB Shell连接到你的files数据库,手动确认文件是否真的存在:
// 查看files集合里的目标文件记录 db.fs.files.find({filename: "b33b78d2-30ea-4fe3-9228-2a8a7ccc8a77.PNG"}) // 根据files记录里的_id,查看对应的chunks数据 db.fs.chunks.find({files_id: ObjectId("替换为上面查到的_id")})
如果files有记录但chunks为空,就坐实了「上传时数据写入失败」的问题,升级MongoDB驱动后就能解决。
内容的提问来源于stack exchange,提问作者Jordi

