无法 receive/send 来自 Lambda 函数中的 Promise 的响应

Unable to receive/send response from a Promise in Lambda function

我有一个 Lambda 函数,在该函数中我从查询字符串中获取一个参数并使用它来调用下游服务,该服务将转变成 return 一个承诺。我无法发回 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;
}

执行此操作时,我从 Lambda 函数输出中收到空响应:{ statusCode: 200, body: '{}' }。我试图通过控制台记录我获得并收到的值:Promise { <pending> } 我怀疑这是我略微忽略的 Javascript/Typescript Promise 问题。在这里感谢任何帮助。提前致谢。

在你的 response 中,你试图将承诺而不是承诺值字符串化,它给你一个空对象作为字符串。

你可以试试:

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

您只能从传递给 then 的回调中访问 Promise 的值。

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

你可能想写

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

以上 returns 包含您的回复的承诺。

你也可以这样写 getSession

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

我建议你在没有 async/await

的情况下练习使用 promises

geoffrey 答案的替代方法,请注意您的两个函数都是 async,这意味着您可以使用与 getSession().

中使用的相同的 await 关键字
export const handler = async (event) => {
     // ...
     const sessionResponse = await getSession(testClient, sessionId);
     //                        ^
     console.log(sessionResponse);
     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;
}

这大致相当于...

export const handler = (event) => {
     // ...
     return getSession(testClient, sessionId).then((data) => {
           console.log(data);
           const response = {
                statusCode: 200,
                body: JSON.stringify(sessionResponse),
           };
           return response;
     });
};

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

请注意,您的 getSession() 函数通过 async 返回一个 Promise(在上面的翻译示例中)。您的 handler() 函数同样会返回一个 Promise,因此无论调用它的是什么,都需要使用 .then()async 本身来利用 await。如您所见,这种异步需求级联。