报错TypeError: grid.mongo.objectID is not a constructor,MongoDB图片上传失败求助
问题原因
这个报错的核心是gridfs-stream第三方包与新版本Mongoose(6.x及以上)不兼容:
- Mongoose 6.x开始内置的MongoDB驱动升级到4.x版本,
gridfs-stream早已停止维护,内部调用ObjectId的命名(大小写错误、导出路径匹配失败)无法适配新驱动的API,所以调用createReadStream时会抛出grid.mongo.objectID is not a constructor错误。 - 你之前的查询功能正常是因为只用到了集合查询能力,没有触发
gridfs-stream内部依赖ObjectId的逻辑。
解决方案
推荐直接使用MongoDB官方原生的GridFSBucket,无需依赖停止维护的gridfs-stream,适配所有新版本Mongoose,修改步骤如下:
- 卸载项目中的
gridfs-stream依赖
npm uninstall gridfs-stream
- 修改GridFS初始化逻辑
// GRID FS 原逻辑替换为下方代码 let gfs, gridfsBucket; conn.once('open' , ()=>{ // 初始化官方原生GridFSBucket gridfsBucket = new mongoose.mongo.GridFSBucket(conn.db, { bucketName: 'uploads' }); // gfs仍指向文件集合,原有查询逻辑无需修改 gfs = conn.db.collection('uploads.files'); });
- 修改图片读取接口的流创建逻辑
// 原const readstream = gfs.createReadStream(file.filename); 替换为下方代码 const readstream = gridfsBucket.openDownloadStream(file._id);
修改完成后即可正常返回图片流,无兼容问题。如果你坚持使用gridfs-stream,只能将Mongoose版本回退到5.x版本,不过不推荐该方案,旧版本存在已知安全漏洞。
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

