0

我可以使用下面提到的代码(节点 --version:v14.15.0)读取本地机器上的data.json.gz文件。但是当我尝试在 IBM Cloud 中使用相同的操作(Node.js 12)从对象存储桶中读取相同的文件时,我收到以下错误 [ “stderr: ERROR: undefined - input_buf.on is not a功能” ]。

我对 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 and 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 )

}
4

1 回答 1

0

该消息告诉您,您的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。

于 2020-12-09T14:41:24.823 回答