मैं अपनी स्थानीय मशीन पर data.json.gz फ़ाइल को नीचे दिए गए कोड के साथ पढ़ सकता हूं (नोड --वर्जन: v14.15.0)। लेकिन जब मैं एक ऑब्जेक्ट स्टोर बकेट से एक ही फाइल को पढ़ने के लिए आईबीएम क्लाउड में एक्शन (नोड.जेएस 12) के साथ इसका उपयोग करने का प्रयास करता हूं, तो मुझे नीचे त्रुटि मिलती है ["stderr: ERROR: undefined - input_buf.on कोई फंक्शन नहीं है"]।

मैं NodeJS के लिए बहुत नया हूँ; क्या कोई यहां इस मुद्दे की पहचान करने में मदद कर सकता है? मैं आपके समर्थन की सराहना करता हूं।

कोड जो स्थानीय मशीन पर काम करता है (विंडोज 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 क्लाउड फ़ंक्शन और ऑब्जेक्ट स्टोर बकेट पर काम नहीं करता है:

 // 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 )

}
0
Mohammad Saiful Islam 7 पद 2020, 07:55

1 उत्तर

सबसे बढ़िया उत्तर

संदेश आपको बता रहा है, कि आपकी 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();
    });

परीक्षण अनुभाग< पर एक नज़र डालें /a> ibm-cos-sdk-js प्रोजेक्ट में, यह वर्णन कर रहा है कि API का उपयोग कैसे किया जाए।

0
briadeus 9 पद 2020, 14:41