首页 > 解决方案 > 无法从 Lambda 函数中的 Promise 接收/发送响应

问题描述

我有一个 Lambda 函数,其中我从查询字符串中获取一个参数并使用它来调用一个下游服务,该服务将返回一个承诺。我无法发回 Promise 收到的响应。

这是我的 Lambda 函数:

export const handler = async (event) => {
     let sessionId = event.queryStringParameters.sessionId;
     const testClient = new Client.WebStoreClient(config);
     const sessionResponse = getSession(testClient, sessionId);
     sessionResponse.then(function (result) {
          console.log(result);
     });
     const response = {
          statusCode: 200,
          body: JSON.stringify(sessionResponse),
     };
     return response;
};

async function getSession(testClient, sessionId) {
     let data = await testClient.getSession(sessionId, headers)
          .then((response) => response.body);
     return data;
}

当我执行此操作时,我得到一个空响应:{ statusCode: 200, body: '{}' }来自 Lambda 函数输出。我试图控制台记录我得到的值并收到这个:Promise { <pending> } 我怀疑这是一个 Javascript/Typescript Promise 问题,我稍微忽略了它。任何帮助在这里表示赞赏。提前致谢。

标签: javascripttypescriptaws-lambdaasync-awaitpromise

解决方案


在您的response中,您试图将 promise 字符串化而不是 promise 值,它为您提供了一个空对象作为字符串。

你可以试试看:

JSON.stringify(Promise.resolve(1)) // output is "{}"

您只能从传递给的回调内部访问 Promise 的值then

可以这样想:里面then是未来,周围的代码是现在。您现在无法引用未来的数据。

你可能想写

return sessionResponse.then(function (result) {
   return {
      statusCode: 200,
      body: JSON.stringify(result),
   }
});

以上返回包含您的响应的承诺。

你也可以这样getSession

function getSession(testClient, sessionId) {
     return testClient.getSession(sessionId, headers)
          .then((response) => response.body);
}

我建议你练习使用没有 async/await 的 Promise


推荐阅读