2015-08-21 58 views
1

我在嘗試複製AWS文檔(link)中的縮略圖示例。我想在創建它時立即使用這個縮略圖。我希望context.done()回調就足夠了。回調給了我一個很好的迴應,但它爲時尚早。圖像大小並不總是可調整的,並且在存儲的s3存儲桶中可用。在調用lambda函數時,我特別將調用類型設置爲「Event」,以便在函數完成調整大小後回調應該返回。AWS Lambda回調節點js太快

鑑於文檔中的例子,等待完成lambda函數的propper方式是什麼?調用lambda函數在我的應用程序的功能,現在看起來像:

AWS.config.loadFromPath('./configs/config.json'); 
var lambda = new AWS.Lambda(); 
var params = { 
FunctionName: 'resizeImage', 
InvocationType: 'Event', 
Payload: JSON.stringify({key: req.body.key}) 
}; 
lambda.invoke(params, function (err, data) { 
if (err) { 
    console.log(err, err.stack); // an error occurred 
} else { 
    console.log(data);   // successful response 
    next(); 
} 
}); 
+0

是您的水桶在美國東部-1,和你看着[一致性模型(https://aws.amazon.com/s3/faqs/#What_data_consistency_model_does_Amazon_S3_employ)作爲說明? – James

+0

我正在使用zone eu-west-1,並且一致性模型似乎不是問題所在,我的CloudWatch日誌顯示以毫秒爲單位完成lambda函數所需的正確時間,只有我的應用程序在此之前被調用。應用程序在500毫秒後獲得響應,而lambda函數需要大約2000毫秒才能完成。 – Menno

回答

0

你不應該阻塞等待Lambda完成。相反,您應該將您的S3 Events發佈到SNS Topic,然後在您的應用程序中處理這些事件。這將保證你訪問它們時你的物體已經到位。

+0

感謝您的想法!但是這似乎並不重要。由於這個lambda函數在圖像上傳後立即被調用,我想等待函數完成。如果sns話題是唯一的路要走,我會牢記這一點。 – Menno

+0

我建議使用S3方法,或者您可以從Lambda本身ping迴應用程序。 – kixorz

+1

如果這是我會讓你知道的解決方案,我會在明天考慮這一點,感謝剛纔的輸入。 – Menno

3

我找到了我的問題的答案。我搞砸了調用函數時可以提供的調用類型。有三種調用方式,在我的問題中我使用「事件」類型。這導致lambda函數給出一個直接的(因此是異步響應),該函數可能還沒有完成。將調用類型更改爲「RequestResponse」提供了一個同步響應,我們希望等待我們的功能完成。

又見AWS Documentation

+0

歡迎來到Stack Overflow。出色的工作,找到自己的解決方案。事實上,你似乎有一個等待完成功能的有效案例。如果你現在需要它,而不是「真的很快」,這是有道理的。 –