使用IBM Cloud Function(操作:Node.js 12)读取gzip文件(.gz)时出现问题



我可以用下面提到的代码(node--version:v14.15.0(在本地机器上读取data.json.gz文件。但当我尝试在IBM Cloud中使用相同的Action(node.js 12(从Object Store Bucket中读取相同的文件时,我会得到以下错误["stderr:错误:undefined-input_buf.on不是函数">]。

我是NodeJS的新手;有人能在这里帮助确定问题吗?我非常感谢你的支持。

在本地计算机(Windows 10(上工作的代码:

function decompressFile(filename) {
var fs = require("fs"),
zlib = require("zlib"),
var input = fs.createReadStream(filename);
var data = [];
input.on('data', function(chunk){
data.push(chunk);
}).on('end', function(){
var buf = Buffer.concat(data);
zlib.gunzip(buf, function(err, buffer) {
if (!err) {
var dataString = buffer.toString()
console.log(dataString, dataString+'n');
var dataJSON = JSON.parse(dataString.toString('utf8'));
}else{
console.log(err);
}
});
});
}
decompressFile("data.json.gz");

不适用于IBM Cloud Function和Object Store Bucket的代码:

// Get file contents of gzipped item
async function getGzippedItem(cosClient, bucketName, itemName) { // <<< async keyword added
const fs = require('fs');
const zlib = require('zlib');

return await cosClient.getObject({  // <<< turned into assignment with await
Bucket: bucketName,
Key: itemName
}).promise() 
.then((instream=fs.createReadStream(itemName)) => {
if (instream != null) {         
var data = [];
var input_buf = instream.Body
input_buf.on('data', function(chunk){
data.push(chunk);
}).on('end', function() {
var buf = Buffer.concat(data);
zlib.gunzip(buf, function (err, buffer) {
if (!err) {
var dataString = buffer.toString()
var dataJSON = JSON.parse(dataString.toString('utf8'));
} else {
console.log(err);
}
});

});
return buf
}
})
.catch((e) => {
console.error(`ERROR: ${e.code} - ${e.message}n`);
}); 
};

async function main(params) {
bucketName = 'bucket'
itemName = 'data.json.gz'
var ibm = require('ibm-cos-sdk');
var util = require('util');
var fs = require('fs');
// Initializing configuration
const myCOS = require('ibm-cos-sdk');
var config = {
endpoint: 'endpoint',
apiKeyId: 'apiKeyId',
ibmAuthEndpoint: 'ibmAuthEndpoint',
serviceInstanceId: 'serviceInstanceId',
};
var cosClient = new myCOS.S3(config);
gzippedItemContent = await getGzippedItem(cosClient, bucketName, itemName) // <<< await keyword added
console.log(">>>>>>>>>>>>>>>: ", typeof gzippedItemContent, gzippedItemContent )
}

消息告诉您,您的input_buf对象不是您期望的类型。createReadStream((调用的结果只是一个流:

[Stream] the readable stream object that can be piped or read from (by registering 'data' event listeners).

因此,您应该能够直接访问该值(未声明var input_buf=instream.Body(:

var getObjectStream = cosClient.getObject({
Bucket: 'BUCKET',
Key: 'KEY'
}).createReadStream();

getObjectStream.on('data', function(c) {
data += c.toString();
});

看看ibm-cos-sdk-js项目的测试部分,它描述了如何使用API。

最新更新