Node.js调用MinIO的getObject方法无法从返回流中获取数据如何解决
问题根因
- 流读取是异步事件驱动逻辑:
await minioClient.getObject()仅能等待流对象返回,不会等待流的data、end回调执行完成,你的代码在流还没读完数据的时候就已经执行了后续的console.log("Buffer = " + buff)和return操作,此时buff还是空数组。 - 异步函数未正确接收返回值:
call是async异步函数,直接调用返回的是Promise对象,必须通过await或者.then()才能拿到实际返回结果。
修复代码
把流读取逻辑封装为Promise,确保等待流完全读完再返回结果:
var Minio = require('minio') var Buffer = require('buffer').Buffer; async function call(){ var minioClient = new Minio.Client({ endPoint: 'localhost', port: 9000, useSSL: false, accessKey: 'admin', secretKey: 'password' }); minioClient.listBuckets(function (err, buckets) { if (err) return console.log(err); console.log('buckets :', buckets); }); // 封装流读取为Promise,等待读取完成 const fileBuffer = await new Promise((resolve, reject) => { let buff = []; let size = 0; minioClient.getObject("test2", "test.jpg").then(dataStream => { dataStream.on('data', chunk => { buff.push(chunk) size += chunk.length }) dataStream.on('end', () => { console.log('End. Total size = ' + size) // 拼接为完整Buffer返回 const fullBuffer = Buffer.concat(buff, size) resolve(fullBuffer) }) dataStream.on('error', err => { console.log(err) reject(err) }) }).catch(err => { console.log(err) reject(err) }) }) console.log("Buffer length = " + fileBuffer.length); return fileBuffer; } // 异步调用必须加await,外层如果是全局可以用自执行async函数 ;(async () => { var data = await call(); console.log("Data length: " + data.length); // 后续要处理图片可以直接用这个Buffer })()
补充说明
如果需要直接把文件保存到本地,也可以直接用MinIO SDK提供的fGetObject方法,不用手动处理流拼接,更简单。
内容的提问来源于stack exchange,提问作者George V
相关产品推荐
相关产品推荐

