GridFS文件查询异常:gfs.files.find()无限加载问题求助
问题解决:GridFS 获取文件无限加载/方法不存在
问题根源
你使用的gridfs-stream是老旧的第三方库,和新版mongoose、MongoDB驱动的API不兼容,导致gfs.files.find()阻塞无响应,gfs.find()提示方法不存在。现在mongoose已经原生集成了官方GridFS实现GridFSBucket,完全可以替代这个第三方包。
解决方案步骤
- 卸载
gridfs-stream依赖:
npm uninstall gridfs-stream
- 移除代码中对
gridfs-stream的引入,改用mongoose自带的GridFSBucket - 修改GridFS初始化逻辑
- 重构GET路由,用异步/await配合
GridFSBucket的查询方法
修改后的完整代码示例
依赖引入与初始化部分
const path = require('path'); const express = require('express'); const app = express(); const multer = require('multer'); const { GridFsStorage } = require('multer-gridfs-storage'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const crypto = require('crypto') require('dotenv').config(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // MongoDB连接 const conn = mongoose.createConnection(process.env.MONGOOSE_URI, { useNewUrlParser: true, useUnifiedTopology: true }); // 初始化GridFSBucket(替代原gfs) let gridFSBucket; conn.once('open', () => { console.log('GridFS initialized!'); gridFSBucket = new mongoose.mongo.GridFSBucket(conn.db, { bucketName: 'uploads' // 和你之前指定的集合名保持一致 }); }); // Multer存储引擎(这部分可保留原代码) const storage = new GridFsStorage({ url: process.env.MONGOOSE_URI, file: (req, file) => { return new Promise((resolve, reject) => { crypto.randomBytes(16, (err, buf) => { if (err) { return reject(err); } const filename = buf.toString('hex') + path.extname(file.originalname); const fileInfo = { filename: filename, metadata:{ name: req.body.name, email: req.body.email, phone: req.body.phone } }; resolve(fileInfo); }); }); } });
获取文件的路由重构
// 获取文件列表 app.get('/data', async (req, res) => { try { // 获取文件游标 const filesCursor = gridFSBucket.find(); // 将游标转为数组(异步操作需用await) const files = await filesCursor.toArray(); if (!files || files.length === 0) { return res.status(404).json({ err: 'No file exists' }); } res.json(files); } catch (err) { res.status(500).json({ err: err.message }); } });
关键说明
GridFSBucket是MongoDB官方推荐的GridFS操作方案,API稳定且兼容新版驱动- 用异步/await处理查询,避免回调嵌套和阻塞问题
- 确保
bucketName和你存储文件时指定的集合名一致
内容的提问来源于stack exchange,提问作者CodingPep
相关产品推荐
相关产品推荐

