2016-04-29 5 views
23

एक नोड.जेएस प्रोजेक्ट में मैं एस 3 से डेटा वापस लेने का प्रयास कर रहा हूं।Node.js में S3 getObject से प्रतिक्रिया कैसे प्राप्त करें?

जब मैं getSignedURL उपयोग करते हैं, सब कुछ काम करता है:

aws.getSignedUrl('getObject', params, function(err, url){ 
    console.log(url); 
}); 

मेरे परम हैं:

var params = { 
       Bucket: "test-aws-imagery", 
       Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par" 

अगर मैं कंसोल के लिए यूआरएल उत्पादन लेने के लिए और एक वेब ब्राउज़र में पेस्ट करें, इसके डाउनलोड फ़ाइल मुझे चाहिए

हालांकि, अगर मैं getObject का उपयोग करने का प्रयास करता हूं तो मुझे सभी प्रकार के अजीब व्यवहार मिलते हैं। मेरा मानना ​​है कि मैं इसे गलत तरीके से इस्तेमाल कर रहा हूं। यह मैं क्या कोशिश की है है:

aws.getObject(params, function(err, data){ 
    console.log(data); 
    console.log(err); 
}); 

आउटपुट:

{ 
    AcceptRanges: 'bytes', 
    LastModified: 'Wed, 06 Apr 2016 20:04:02 GMT', 
    ContentLength: '1602862', 
    ETag: '9826l1e5725fbd52l88ge3f5v0c123a4"', 
    ContentType: 'application/octet-stream', 
    Metadata: {}, 
    Body: <Buffer 01 00 00 00 ... > } 

    null 

तो ऐसा लगता है कि यह ठीक से काम कर रहा है। हालांकि, जब मैंने console.log एस में से एक पर ब्रेकपॉइंट लगाया, तो मेरा आईडीई (नेटबीन) एक त्रुटि फेंकता है और डेटा के मूल्य को दिखाने से इंकार कर देता है। हालांकि यह आईडीई हो सकता है, मैंने getObject का उपयोग करने के अन्य तरीकों का प्रयास करने का निर्णय लिया।

aws.getObject(params).on('httpData', function(chunk){ 
    console.log(chunk); 
}).on('httpDone', function(data){ 
    console.log(data); 
}); 

यह कुछ भी आउटपुट नहीं करता है। शो में एक ब्रेकपॉइंट डालने से पता चलता है कि कोड कभी भी console.log एस तक पहुंचता नहीं है। मैं भी करने की कोशिश की:

aws.getObject(params).on('success', function(data){ 
    console.log(data); 
}); 

बहरहाल, यह भी नहीं है उत्पादन कुछ भी है और एक ब्रेकपाइंट रखने पता चलता है कि console.log कभी नहीं पहुँच जाता है।

मैं क्या गलत कर रहा हूं?

+0

क्या आपकी 'aws' ऑब्जेक्ट वास्तव में 'aws.S3' ऑब्जेक्ट का एक नया उदाहरण है? साथ ही, 'getObject()' को http प्रतिक्रिया पर वापस भेज दिया जा रहा है या क्या यह फ़ाइल में पाइप किया जा रहा है? – peteb

+0

@peteb 'aws = new AWS.S3()'। प्रतिक्रिया को फ़ाइल में पाइप नहीं किया जाना चाहिए। मुझे इसे जावास्क्रिप्ट –

+0

में उपयोग करने की आवश्यकता है तो क्या यह मानना ​​सुरक्षित है कि सामग्री जेएसओएन या एक्सएमएल है? – peteb

उत्तर

47

जब S3 एपीआई से एक getObject() कर रही है, docs अपने फ़ाइल की सामग्री Body संपत्ति है, जो आप देख सकते हैं में स्थित हैं प्रति अपने नमूना आउटपुट से। आप कोड है जो निम्न

const aws = require('aws-sdk'); 
const s3 = new aws.S3(); // Pass in opts to S3 if necessary 

var getParams = { 
    Bucket: 'abc', // your bucket name, 
    Key: 'abc.txt' // path to the object you're looking for 
} 

s3.getObject(getParams, function(err, data) { 
    // Handle any error and exit 
    if (err) 
     return err; 

    // No error happened 
    // Convert Body from a Buffer to a String 

    let objectData = data.Body.toString('utf-8'); // Use the encoding necessary 
}); 

आप data.Body वस्तु से एक नया बफर बनाने के लिए, लेकिन आप आपको लगता है कि प्राप्त करने के लिए उपर्युक्त नमूने का उपयोग कर सकते की जरूरत है की आवश्यकता नहीं होती तरह दिखता होना चाहिए।

+0

तो वापस आने वाला डेटा एक 'बफर' ऑब्जेक्ट प्रतीत होता है, जिसे मैं परिचित नहीं हूं। सैद्धांतिक रूप से मैं सामग्री प्राप्त करने के लिए 'नया बफर (डेटा। बॉडी) .toString ('utf-8') का उपयोग कर सकता हूं? –

+1

यदि सामग्री पहले से ही एक बफर है, तो उसमें से एक नया बफर बनाने की आवश्यकता नहीं है। बस बस 'डेटा करें। बॉडी.टोस्ट्रिंग (' utf-8 '); '। एक बफर नोड में बाइनरी डेटा का प्रतिनिधित्व है, अगर आपको अधिक जानकारी चाहिए [यहां दस्तावेज़ हैं] (https://nodejs.org/api/buffer.html) – peteb

+0

धन्यवाद! अगर मैं वास्तव में ब्रेकपॉइंट काम कर सकता हूं तो यह काम करना इतना आसान होगा। किसी भी कारण से (और यह एकमात्र ऐसा स्थान है जहां मैंने ऐसा किया है), फ़ंक्शन के भीतर नेटबीन्स किसी भी वेरिएबल मानों को दिखाने से इनकार करते हैं –

0

पहली नज़र में ऐसा नहीं लगता कि आप कुछ भी गलत कर रहे हैं लेकिन आप अपना पूरा कोड नहीं दिखाते हैं। निम्नलिखित मेरे लिए काम किया जब मैं पहली बार S3 और नोड बाहर की जाँच की गई थी:

var AWS = require('aws-sdk'); 

if (typeof process.env.API_KEY == 'undefined') { 
    var config = require('./config.json'); 
    for (var key in config) { 
     if (config.hasOwnProperty(key)) process.env[key] = config[key]; 
    } 
} 

var s3 = new AWS.S3({accessKeyId: process.env.AWS_ID, secretAccessKey:process.env.AWS_KEY}); 
var objectPath = process.env.AWS_S3_FOLDER +'/test.xml'; 
s3.putObject({ 
    Bucket: process.env.AWS_S3_BUCKET, 
    Key: objectPath, 
    Body: "<rss><data>hello Fred</data></rss>", 
    ACL:'public-read' 
}, function(err, data){ 
    if (err) console.log(err, err.stack); // an error occurred 
    else { 
     console.log(data);   // successful response 
     s3.getObject({ 
      Bucket: process.env.AWS_S3_BUCKET, 
      Key: objectPath 
     }, function(err, data){ 
      console.log(data.Body.toString()); 
     }); 
    } 
}); 
2
वैकल्पिक रूप से

आप कर सकते थे आप minio-js client libraryget-object.js

var Minio = require('minio') 

var s3Client = new Minio({ 
    endPoint: 's3.amazonaws.com', 
    accessKey: 'YOUR-ACCESSKEYID', 
    secretKey: 'YOUR-SECRETACCESSKEY' 
}) 

var size = 0 
// Get a full object. 
s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { 
    if (e) { 
    return console.log(e) 
    } 
    dataStream.on('data', function(chunk) { 
    size += chunk.length 
    }) 
    dataStream.on('end', function() { 
    console.log("End. Total size = " + size) 
    }) 
    dataStream.on('error', function(e) { 
    console.log(e) 
    }) 
}) 

अस्वीकरण: मैं Minio इसका खुला स्रोत के लिए काम करते हैं, S3 संगत वस्तु भंडारण उपलब्ध ग्राहक पुस्तकालयों के साथ golang में लिखा Java में, Python, Js , golang

संबंधित मुद्दे