我如何最终在 Lambda 函数中返回 promise 的值?

Posted

技术标签:

【中文标题】我如何最终在 Lambda 函数中返回 promise 的值?【英文标题】:How do I ultimately return the value of a promise in a Lambda function? 【发布时间】:2019-10-27 22:25:40 【问题描述】:

我在 Lambda 中有一个 NodeJS 函数,它调用一个库以便在 Dynamo DB 中运行地理空间查询。

最终,我希望这个查询的结果由 Lambda 返回,因为这个 Lambda 函数最终会被另一个函数调用,因此必须返回结果。

我无法在 Lambda 函数中返回承诺的结果。

我已经尝试多次重写代码,理解承诺,使用异步等待......我已经阅读了许多文章,包括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 Getting API call in node8.10 in Lambda results in Promise <pending> and 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.log(data);
    return data;

代码运行,但 Lambda 返回 [] 作为结果。

【问题讨论】:

***.com/questions/14220321/…的潜在重复 会不会是因为data真的是一个空集,即 DDB 中没有与您的查询匹配的数据? 不,如果我在 promise 上运行 .then() 并 console.log 它,我会得到预期的响应。 【参考方案1】:

我想通了!无聊的时刻。

根据AWS,要在 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 有点模糊。很高兴你有它的工作,但我认为还有更多的故事。【参考方案2】:

尽我所能,我只是看不出你的代码有问题。如果.then(data =&gt; console.log(data) 有效,那么您的代码确实应该有效。也许将这个问题留给可以看到我看不到的东西的人对我更有帮助。但与此同时,您可能可以使用 lambda 调用的回调样式使其工作。也许它甚至会帮助揭示问题的另一个细节......

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

【讨论】:

以上是关于我如何最终在 Lambda 函数中返回 promise 的值?的主要内容,如果未能解决你的问题,请参考以下文章

如果 x 在集合 L 中,如何使用 lambda 函数创建返回 true 的函数 L

返回 lambda 的函数的类型注释

如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?

返回 lambda 表达式的函数

如何从 lambda 函数返回字符串?

如何从 JAVA 调用 AWS lambda 函数?