Lambda 函数:尽管将对象推送到函数内部,数组仍返回空
Lambda Function: array returning empty despite pushing object to it inside function
我将以下代码用作在 API 调用中执行的 lambda 函数。
我遇到的问题是,当 response
和 callback
位于数组 scans
returns []
的当前位置时,即使扫描对象被填充并推送到数组。然而,当 response
和 callback
被放置在 ***PLACEHOLDER***
部分时,数组 returns 填充了扫描对象。
我知道这与代码的异步性质有关,因为我在堆栈上查看了许多类似的问题,但除了 AWS-SDK 代码之外,我不知道如何纠正它。
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
for (var i = 0; i < data.things.length; i++) {
var device = data.things[i].attributes;
const params = {
// redacted
};
ddb.query(params, function(err, data) {
if (err) {
callback(err, null);
}
else {
var scan = {
"area": device.area,
"count": data["Count"]
};
scans.push(scan);
// ***PLACEHOLDER***
}
});
}
}
var response = {
"statusCode": 200,
"headers": {},
"body": JSON.stringify(scans),
"isBase64Encoded": false
};
callback(null, response);
});
};
这是一个异步问题,而不是 Lambda。您的代码应如下所示:
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
populateScans(data).then(res => {
callback(null,{
"statusCode": 200,
"headers": {},
"body": JSON.stringify(res),
"isBase64Encoded": false
})
}).catch(callback)
}
});
};
function populateScans(data) {
return Promise.all(data.things.map(thing => {
let device = thing.attributes
const params = {}
return ddb.query(params).promise().then(res => {
return {
area: device.area,
count: res["Count"]
}
})
}))
}
我将以下代码用作在 API 调用中执行的 lambda 函数。
我遇到的问题是,当 response
和 callback
位于数组 scans
returns []
的当前位置时,即使扫描对象被填充并推送到数组。然而,当 response
和 callback
被放置在 ***PLACEHOLDER***
部分时,数组 returns 填充了扫描对象。
我知道这与代码的异步性质有关,因为我在堆栈上查看了许多类似的问题,但除了 AWS-SDK 代码之外,我不知道如何纠正它。
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
for (var i = 0; i < data.things.length; i++) {
var device = data.things[i].attributes;
const params = {
// redacted
};
ddb.query(params, function(err, data) {
if (err) {
callback(err, null);
}
else {
var scan = {
"area": device.area,
"count": data["Count"]
};
scans.push(scan);
// ***PLACEHOLDER***
}
});
}
}
var response = {
"statusCode": 200,
"headers": {},
"body": JSON.stringify(scans),
"isBase64Encoded": false
};
callback(null, response);
});
};
这是一个异步问题,而不是 Lambda。您的代码应如下所示:
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
populateScans(data).then(res => {
callback(null,{
"statusCode": 200,
"headers": {},
"body": JSON.stringify(res),
"isBase64Encoded": false
})
}).catch(callback)
}
});
};
function populateScans(data) {
return Promise.all(data.things.map(thing => {
let device = thing.attributes
const params = {}
return ddb.query(params).promise().then(res => {
return {
area: device.area,
count: res["Count"]
}
})
}))
}