mongoose6搭配gridfs-stream报错GridStore不是构造函数,求长期解决方案
Mongoose 6+ GridFS读取文件报错解决方案
错误原因
gridfs-stream@1.1.1已停止维护多年,不兼容Mongoose 6+依赖的MongoDB Node.js Driver 4.x版本,该版本官方已移除废弃的GridStore接口,因此调用gfs.createReadStream时会抛出构造函数不存在的错误。
长期兼容解决方案
无需降级Mongoose版本,直接使用MongoDB原生内置的GridFSBucket接口即可实现所有GridFS操作,无需额外安装第三方依赖,兼容所有后续版本。
步骤1:替换初始化逻辑
删除gridfs-stream的引入,替换为原生GridFSBucket初始化代码:
const mongoose = require("mongoose"); // 直接从mongodb包导入GridFSBucket,Mongoose已内置该依赖无需额外安装 const { GridFSBucket } = require("mongodb"); let gfsBucket; const connection = mongoose.connection; connection.once('open', () => { // 初始化GridFSBucket,第二个参数可自定义bucket名称,默认值为fs gfsBucket = new GridFSBucket(connection.db, { bucketName: "fs" }); })
步骤2:替换文件读取逻辑
将原来的gfs.createReadStream替换为GridFSBucket提供的流方法:
app.get("/files", async (req, res) => { try { const targetFilename = "09ff76ee0d54433c1090117e479f679e.jpg"; // 校验文件是否存在 const fileList = await gfsBucket.find({ filename: targetFilename }).toArray(); if (!fileList || fileList.length === 0) { return res.status(404).json({ message: "请求的文件不存在" }); } // 创建文件读取流并返回 const readStream = gfsBucket.openDownloadStreamByName(targetFilename); readStream.pipe(res); // 监听流错误避免服务崩溃 readStream.on("error", (err) => { console.log(err); res.status(500).json(err); }); } catch (error) { console.log(error); res.status(500).send(error); } });
扩展说明
- 如果需要按文件ID读取,可使用
gfsBucket.openDownloadStream(fileId)方法,参数为文件的ObjectId类型_id - 如果需要上传文件到GridFS,可使用
gfsBucket.openUploadStream(filename)方法创建写入流,完全可以替代multer-gridfs-storage等旧依赖
内容的提问来源于stack exchange,提问作者Samyuktha0511
相关产品推荐
相关产品推荐

