करता है मैं एक लैम्ब्डा समारोह के लिए निम्न कोड है:क्वैरी DynamoDB कुछ भी नहीं
console.log('Loading function');
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();
function getUser(userid) {
var q = ddb.getItem({
TableName: "Users",
Key: {
userID: { S: userid } }
}, function(err, data) {
if (err) {
console.log(err);
return err;
}
else {
console.log(data);
}
});
console.log(q);
}
exports.handler = function(event, context) {
console.log('Received event');
getUser('user1');
console.log("called DynamoDB");
context.succeed();
};
मैं एक [उपयोगकर्ता] तालिका है कि इस तरह के रूप में परिभाषित किया गया है है:
{
"cognitoID": { "S": "token" },
"email": { "S": "[email protected]" },
"password": { "S": "somepassword" },
"tos_aggreement": { "BOOL": true },
"userID": { "S": "user1" }
}
जब मैं फोन फ़ंक्शन (एडब्ल्यूएस कंसोल या सीएलआई से) मैं लॉग में संदेशों को देख सकता हूं लेकिन getItem() के लिए कॉलबैक कभी नहीं कहा जाता है।
मैंने कोई कॉलबैक के साथ getItem (पैराम्स) करने की कोशिश की, फिर पूर्ण, सफलता और विफलता के लिए कॉलबैक परिभाषित किया लेकिन जब मैं भेजता हूं(), यहां तक कि पूर्ण कॉलबैक भी नहीं कहा जाता है।
मुझे पता है कि कॉल अतुल्यकालिक कर रहे हैं और मुझे लगता है कि हो सकता है, लैम्ब्डा समारोह से पहले क्वेरी किया गया था और इसलिए कॉलबैक कहा जाता है नहीं किया जाएगा परिष्करण गया था, लेकिन, मैं समारोह के अंत में एक सरल बेवकूफ पाश जोड़ और बिना किसी कॉलबैक के कॉल के कॉल को 3 सेकंड के बाद समाप्त कर दिया गया।
मैंने बैचगेटइटम, getItem, listTables और स्कैन के विभिन्न कार्यों के साथ प्रयास किया। नतीजा वही है, कोई त्रुटि नहीं है लेकिन कॉलबैक फ़ंक्शन कभी नहीं कहा जाता है।
मैं शर्त लगा रहा हूं कि अगर मैं लैम्ब्डा का उपयोग किए बिना डायनेमो डीबी पूछता हूं तो मुझे परिणाम मिलेंगे इसलिए मैं वास्तव में सोच रहा हूं कि यहां कुछ भी क्यों नहीं हो रहा है।
मैं फ़ंक्शन के लिए एक भूमिका निभाता हूं और मैंने एक नीति बनाई है जो मुझे डायनेमो डीबी में कार्यक्षमताओं तक पहुंच की अनुमति देगी, लेकिन मुझे कोई फायदा नहीं हुआ।
नीति इस तरह दिखता है:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:*:*:*" }, { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:GetRecords", "dynamodb:ListTables" ], "Resource": "arn:aws:dynamodb:*:*:*" }, { "Action": [ "logs:*" ], "Effect": "Allow", "Resource": "*" } ] }
मैं सिम्युलेटर में नीति भाग गया और यह काम किया के रूप में मैंने सोचा कि यह होगा। सुझाव?
क्या आपको एक संदेश मिल रहा था जो कहता है कि अनुरोध पूरा करने से पहले प्रक्रिया समाप्त हो गई है? –
नहीं क्योंकि मेरे पास एक संदर्भ था।() या context.succeed() वहां कॉल करें। मुद्दा यह है कि JSNode स्क्रिप्ट असीमित है और जब आप डायनेमो डीबी को कॉल करते हैं, तो लैम्बडा फ़ंक्शन समाप्त होने के बाद से इसकी कॉलबैक कभी नहीं कह सकती है। तथ्य की बात है, डायनेमो डीबी कार्रवाई में शुरू करने का समय भी नहीं है। –