Лямбда-функция: массив возвращается пустым, несмотря на то, что объект помещается внутрь функции - PullRequest
0 голосов
/ 24 сентября 2019

Я использую приведенный ниже код в качестве лямбда-функции, выполняемой при вызове API.

У меня возникает проблема, когда response и callback находятся в своей текущей позиции в массиве scans возвращает [], даже если сканируемый объект заполняется и помещается в массив.Однако, когда response и callback помещаются в секцию ***PLACEHOLDER***, массив возвращает заполненный объектом сканирования.

Я понимаю, что это как-то связано с асинхронной природой кода, как я выгляделна многие похожие вопросы по стеку, но наряду с кодом 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);
    });
};

1 Ответ

2 голосов
/ 24 сентября 2019

это асинхронная проблема, а не лямбда.Ваш код должен выглядеть следующим образом:

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"]
            }

        })
    }))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...