必须使用 GridFSBucket + 可读流上传文件,Node.js MongoDB 驱动 v4.0+ 已移除 Grid 构造函数;初始化需 await client.connect() 后调用 client.db().collection() 获取 db;openUploadStream 仅接受 Readable 流,不可传 Buffer 或路径字符串;下载时须 pipe 或监听事件确保流消费完毕。

必须用 GridFSBucket + 可读流(Readable),传 Buffer 或路径字符串会直接报错。
上传前必须用 GridFSBucket 初始化,别再用 new Grid()
Node.js MongoDB 驱动 v4.0+ 已彻底移除 Grid 构造函数,任何 new Grid(...) 写法都会触发 ReferenceError: Grid is not defined。这不是环境问题,是 API 断层。
-
GridFSBucket是唯一合法入口,初始化时可选{ bucketName: 'fs' }(默认就是'fs',对应fs.files和fs.chunks两个集合) - 别混用已废弃的
gridfs-stream:它底层仍调Grid,npm install 后实际无法运行 - 连接后必须显式
await client.connect(),再取client.db().db('yourdb'),否则bucket初始化会失败
openUploadStream 只接受 Readable 流,Buffer 和字符串都不行
openUploadStream(filename, options) 的第一个参数是文件名,第二个是元数据对象(如 { contentType: 'image/jpeg', userId: 'u123' }),但它不接收内容本身——内容必须通过流管道写入。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 传
fs.readFileSync('./a.jpg')返回的Buffer?会报TypeError: source.on is not a function - 传
'./a.jpg'字符串?什么都不会发生,upload stream 不会自动读文件 - 正确做法:用
fs.createReadStream('./a.jpg')或Readable.from(buffer)(Node.js ≥12.3.0)构造流 - Express + Multer 场景下,
req.file.stream就是现成的Readable,直接req.file.stream.pipe(uploadStream)
下载时不能只开流,必须消费或 pipe,否则 HTTP 请求卡死
bucket.openDownloadStream(fileId) 返回一个 Readable,但它不会自动触发读取——你得手动监听事件或 pipe 到响应体,否则连接永远挂起。
- 漏掉
stream.on('end', () => res.end()),会导致部分文件下载完但连接未关闭,客户端等待超时 - 在 Express 中,必须提前设响应头:
res.setHeader('Content-Type', doc.contentType)、res.setHeader('Content-Disposition', `attachment; filename="${doc.filename}"`) - 别用已废弃的
createDownloadStream:v4+ 驱动里它不存在,调了就报GridFSBucketReadStream is not a constructor - 文件 ID 必须是有效
ObjectId,从findOne({ filename: 'x.pdf' })拿到文档后取doc._id,别传字符串或null._id
真正容易被忽略的是流生命周期管理:上传要等 uploadStream.on('finish', ...) 才算写完,下载要确保 pipe 完整或事件链闭合,否则看似成功实则数据残缺或连接泄漏。

















