我如何最终在 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 => 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