У меня есть функция 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 возвращает [] в качестве результата.
Не будет ли это вызвано тем, что data
является пустым набором В самом деле, то есть нет данных, соответствующих вашему запросу в DDB?
Нет, если я запускаю .then() для промиса и записываю его в console.info, я получаю ожидаемый ответ.
Как бы я ни старался, я просто не вижу проблемы с вашим кодом. Если .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
немного скрывает это. Рад, что у вас это работает, но я думаю, что это еще не все.
Возможный дубликат stackoverflow.com/questions/14220321/…