2015-05-16 11 views
6

मैं एस 3 पर एक छवि अपलोड करने की कोशिश कर रहा हूं लेकिन जब मैं s3.putObject (पैराम्स, कॉलबैक) कहता हूं, तो मेरा कॉलबैक कभी नहीं बुलाया जाता है और कोई त्रुटि लॉग नहीं होती है।S3.putObject - कॉलबैक कभी नहीं कहा जाता है

var params = { 
    Key: key, 
    Body: imageData, 
    ContentLength: imageData.byteCount, 
    ContentType: contentType, 
}; 
this.s3.putObject(params, function(err, data) { 
    console.log('here'); 
    if (err) { 
    callback(err); 
    return; 
    } 
    callback(null, key); 
}); 

कहाँ पैरामीटर { Key: 'e2f99bf3a321282cc7dfaef69fe8ca62.jpg', Body: {imageData parsed from request using node-multiparty}, ContentLength: 27802, ContentType: 'image/jpeg', }

मैं मान्य है this.s3 सत्यापित किया है और typeof this.s3.putObject समारोह की उम्मीद है:

यहाँ प्रासंगिक कोड है।

+0

आपको एनपीएम से 'नॉक' मॉड्यूल स्थापित करने और उसे आवश्यकतानुसार कुछ अंतर्दृष्टि मिल सकती है जो प्रिंट करेगा कि वास्तव में कौन सी यूआरएल का अनुरोध किया जा रहा है। यदि प्रोग्राम कॉलबैक के लिए प्रतीक्षा कर रहा है, तो शायद फ़ायरवॉल टीसीपी कनेक्शन प्रयास को अनदेखा कर रहा है। क्या आपने प्रोग्राम को कई मिनट तक लटका दिया है, यह देखने के लिए कि क्या अंततः समय समाप्त हो गया है और कॉलबैक को तब बुलाया जाता है? –

+0

क्या आपका प्रोग्राम एसिंक घटना से पहले मूल्य निष्पादन समाप्त कर सकता है? एडब्ल्यूएस लैम्ब्डा के साथ एक समान विषय देखें: https://stackoverflow.com/questions/28449363/why-is-this-http-request-not-working-on-aws-lambda –

उत्तर

3

इस कोड को एक लैम्ब्डा समारोह तुम इतनी तरह putObject के कॉलबैक फ़ंक्शन भीतर context.done() जोड़ने की जरूरत के लिए इस्तेमाल किया जा रहा है:

 s3.putObject(params, function(err, data) { 
      if (err) console.log(err, err.stack); // an error occurred 
      else  console.log(data);   // successful response 
      context.done(); 
     }); 

यह निष्पादन मजबूर करता जब तक कॉलबैक से पहले भर जाता है प्रतीक्षा करने के लिए यह निकलता है इस काम के लिए आपको मुख्य हैंडलर से किसी भी संदर्भ.succeed या context.done को हटाने की आवश्यकता होगी यदि आपके पास कोई है।

+0

इसमें "संदर्भ" क्या है ... उम ... संदर्भ? इसे आपके कोड या मूल प्रश्न में कहीं भी घोषित नहीं किया गया है। –

+0

आह, अच्छा बिंदु @boutell। मुझे लगता है कि यह सवाल एडब्ल्यूएस लैम्ब्डा का उपयोग करने का जिक्र कर रहा था, हालांकि यह स्पष्ट रूप से ऐसा नहीं कहता है। मैं इसे प्रतिबिंबित करने के लिए अपना उत्तर संपादित करूंगा। संदर्भ एक Lambda विशिष्ट वस्तु है। यदि लैम्ब्डा का उपयोग करते हैं, तो कॉलबैक फ़ंक्शन के भीतर संदर्भ परिष्करण विधि (पूर्ण, सफल, असफल) पर कॉल करने की आवश्यकता होती है ताकि इसे समाप्त किया जा सके। यदि यह लैम्ब्डा कोड नहीं है, तो कॉलबैक पूर्ण होने से पहले प्रोग्राम का उपयोग समाप्त हो रहा है। – Charles

+0

स्पष्टीकरण के लिए धन्यवाद! आप शायद "एडब्ल्यूएस लैम्ब्डा" लिखना चाहें क्योंकि लैम्ब्डा कार्यों का अधिक सामान्य अर्थ है। –

0

मुझे सभी आईएएम अधिकारों के साथ बिल्कुल वही व्यवहार मिला, और इसे काम करने से पहले थोड़ा सा समय गंवा दिया।

यदि आपका लैम्ब्डा फ़ंक्शन वीपीसी के अंदर चलता है तो आपको this article from AWS blog में वर्ण के रूप में S3 के लिए एंडपॉइंट बनाना होगा।

यदि आप विवरण में अधिक जानकारी देखना चाहते हैं जहां यह लटकता है, तो आप निम्न कोड का उपयोग कर सकते हैं। कॉलबैक देने के बजाय अनुरोध पर संदर्भ रखें और मूल रूप से इसकी घटनाओं का निरीक्षण करें (S3.putObject और AWS.Request के दस्तावेज़ देखें)।

var obj = s3.putObject(params); 
obj.on('validate',    (...args)=>{args.unshift('validate');    console.log(...args);}) 
    .on('build',    (...args)=>{args.unshift('build');    console.log(...args);}) 
    .on('sign',     (...args)=>{args.unshift('sign');     console.log(...args);}) 
    .on('send',     (...args)=>{args.unshift('send');     console.log(...args);}) 
    .on('retry',    (...args)=>{args.unshift('retry');    console.log(...args);}) 
    .on('extractError',   (...args)=>{args.unshift('extractError');   console.log(...args);}) 
    .on('extractData',   (...args)=>{args.unshift('extractData');   console.log(...args);}) 
    .on('success',    (...args)=>{args.unshift('success');    console.log(...args);}) 
    .on('error',    (...args)=>{args.unshift('error');    console.log(...args);}) 
    .on('complete',    (...args)=>{args.unshift('complete');    console.log(...args);}) 
    .on('httpHeaders',   (...args)=>{args.unshift('httpHeaders');   console.log(...args);}) 
    .on('httpData',    (...args)=>{args.unshift('httpData');    console.log(...args);}) 
    .on('httpUploadProgress', (...args)=>{args.unshift('httpUploadProgress'); console.log(...args);}) 
    .on('httpDownloadProgress', (...args)=>{args.unshift('httpDownloadProgress'); console.log(...args);}) 
    .on('httpError',   (...args)=>{args.unshift('httpError');   console.log(...args);}) 
    .on('httpDone',    (...args)=>{args.unshift('httpDone');    console.log(...args);}) 
    .send(); 

ऐसा करने से तो मैं देखने के लिए अंतर्निहित HTTP अनुरोध बाल्टी है, जो एक VPC से संभव नहीं है जब तक आप अंत बिंदु :) है सार्वजनिक यूआरएल पहुँचने की कोशिश कर रहा था मिल गया।

यहां वीपीसी से AWS blog से एडब्ल्यूएस संसाधनों तक पहुंचने के बारे में एक और पोस्ट भी है।

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