Как мне в конечном итоге вернуть значение обещания в лямбда-функции?

У меня есть функция NodeJS в Lambda, которая обращается к библиотеке, чтобы выполнить геопространственный запрос в Dynamo DB.

В конечном счете, я хотел бы, чтобы результаты этого запроса были возвращены Lambda, поскольку эта функция Lambda в конечном итоге будет вызываться другой, и поэтому результаты должны быть возвращены.

Я не могу вернуть результаты обещания в лямбда-функции.

Я несколько раз пытался переписать код, понимать промисы, использовать асинхронное ожидание... Я прочитал ряд статей, включая https://dashbird.io/blog/aws-lambda-supports-node-version-8.10/https://techsparx.com/software-development/aws/aws-sdk-promises.htmlhttps://medium.com/tensult/async-await-on-aws-lambda-function-for-nodejs-2783febbccd9Получение вызова API в node8.10 в Lambda приводит к Promise <pending> и undefined

Но безрезультатно.

const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB();
const ddbGeo = require('dynamodb-geo');
const config = new ddbGeo.GeoDataManagerConfiguration(ddb, 'MyGeoTable');
const myGeoTableManager = new ddbGeo.GeoDataManager(config);

exports.handler = async function (event, context) {
    let data = await myGeoTableManager.queryRadius({
        RadiusInMeter: 1000,
        CenterPoint: {latitude: 51.50, longitude: -0.17}
    });
    console.info(data);
    return data;
}

Код выполняется, но Lambda возвращает [] в качестве результата.

Возможный дубликат stackoverflow.com/questions/14220321/…

horia 13.06.2019 12:41

Не будет ли это вызвано тем, что data является пустым набором В самом деле, то есть нет данных, соответствующих вашему запросу в DDB?

Stock Overflaw 13.06.2019 13:59

Нет, если я запускаю .then() для промиса и записываю его в console.info, я получаю ожидаемый ответ.

Ben Freke 13.06.2019 14:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
3
3 729
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как бы я ни старался, я просто не вижу проблемы с вашим кодом. Если .then(data => console.info(data) работает, то ваш код действительно должен работать. Возможно, для меня было бы полезнее оставить этот вопрос тому, кто может видеть что-то, чего не могу я. Но тем временем вы, вероятно, можете заставить его работать, используя стиль обратного вызова лямбда-вызова. Может быть, это даже поможет раскрыть еще одну деталь вопроса...

const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB();
const ddbGeo = require('dynamodb-geo');
const config = new ddbGeo.GeoDataManagerConfiguration(ddb, 'MyGeoTable');
const myGeoTableManager = new ddbGeo.GeoDataManager(config);

exports.handler = function (event, context, callback) {
    myGeoTableManager.queryRadius({
        RadiusInMeter: 1000,
        CenterPoint: {latitude: 51.50, longitude: -0.17}
    })
        .then(data => {
            console.info(data);
            callback(null, data);
        });
}
Ответ принят как подходящий

Я понял! Пустой момент.

Согласно АМС, чтобы получить результаты обещания в Lambda, вам нужно вернуть обещание. Итак, изменив мой код на:

const AWS = require('aws-sdk');
AWS.config.loadFromPath('./config.json');
const ddb = new AWS.DynamoDB();
const ddbGeo = require('dynamodb-geo');
const config = new ddbGeo.GeoDataManagerConfiguration(ddb, 'MyGeoTable');
const myGeoTableManager = new ddbGeo.GeoDataManager(config);

exports.handler = function (event, context) {
    return myGeoTableManager.queryRadius({
        RadiusInMeter: 1000,
        CenterPoint: {latitude: 51.50, longitude: -0.17}
    });
};

Решил это.

Однако ваш исходный код возвращал обещание. Любая функция, помеченная async, действительно возвращает обещание. awaits немного скрывает это. Рад, что у вас это работает, но я думаю, что это еще не все.

bigh_29 14.06.2019 20:53

Другие вопросы по теме