Node.js使用gridfs-stream时报GridStore不是构造函数如何修复?
gridfs-stream报错GridStore is not a constructor 解决方案
根本原因
你遇到的报错是依赖版本不兼容导致的:gridfs-stream最后一次维护是2018年,完全不兼容 MongoDB Node.js 驱动v4+、Mongoose v6+版本。新版MongoDB驱动已经完全移除了废弃的GridStore接口,同时把ObjectID调整为ObjectId,这就是你改完大小写后又出现新报错的原因。此外直接修改node_modules内的源码是不可靠的,重装依赖或者换部署环境都会导致修改失效。
解决方案
方案1:降级Mongoose版本(适配旧代码,改动最小)
直接将Mongoose降级到v5.x版本,对应内置的MongoDB驱动为v3.x,完全兼容gridfs-stream,无需修改业务代码:
- 卸载现有Mongoose:
npm uninstall mongoose
- 安装v5版本Mongoose:
npm install mongoose@5.13.17
安装完成后直接启动项目即可,不需要再修改gridfs-stream的源码。
方案2:使用原生GridFSBucket替代gridfs-stream(推荐,适合长期维护)
MongoDB驱动官方已经内置了GridFS操作接口GridFSBucket,不需要再依赖停止维护的gridfs-stream,修改代码如下:
- 移除
gridfs-stream相关代码:
删除const Grid = require('gridfs-stream');这行引入 - 替换gfs初始化逻辑:
将原来的conn连接初始化代码替换为:
let gfs conn.once('open', () => { // 用官方原生GridFSBucket初始化 gfs = new mongoose.mongo.GridFSBucket(conn.db, { bucketName: 'images' }); });
- 修改图片读取接口逻辑:
将/retrieve/image/single接口替换为以下代码:
app.get('/retrieve/image/single', (req, res) => { console.log(req.query.name) gfs.find({filename: req.query.name}).toArray((err, files) => { if(err) { res.status(500).send(err) } else { console.log(files) if(!files || files.length === 0) { console.log("hi i errored out") res.status(404).json({err: 'file not found'}) } else { console.log("hi i am trying to read") const readstream = gfs.openDownloadStreamByName(req.query.name) readstream.pipe(res) } } }) })
其他上传逻辑不需要改动,修改完成后直接启动项目即可正常运行。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

