Как в конечном итоге вернуть значение обещания в лямбда-функции? - PullRequest
2 голосов
/ 13 июня 2019

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

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

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

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

Безрезультатно.

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.log(data);
    return data;
}

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

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я понял это!Моментальный момент.

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

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}
    });
};

Решил это.

0 голосов
/ 14 июня 2019

Как ни старайся, я просто не вижу проблемы с твоим кодом.Если .then(data => console.log(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.log(data);
            callback(null, data);
        });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...