【问题标题】:How to make Lambda function to wait till async operation finished?如何让 Lambda 函数等待异步操作完成?
【发布时间】:2021-04-16 14:07:51
【问题描述】:

我是 NodeJS 和 AWS Lambda 的新手。我正在创建一个 lambda 函数来获取 s3 put 对象的预签名 URL。我在这里面临的问题是,调用 s3.getSignedUrl 是异步进程,它在回调中响应签名 URL,但在此调用响应之前,lambda 函数控件在此调用之后到达下一行,并且在客户端收到空响应。这是我的 lambda 函数的代码 sn-p。


exports.handler = async (event) => {

  // Some stuff like reading inputs from request, initialising s3 object with AWS_ACCESS_KEY, and AWS_SECRET_KEY

  var response="default response";
   response =  s3.getSignedUrl('putObject', {
    "Bucket": myBucket,
    "Key": fileName,
    "ContentType": fileType
  }, function (err, url) {
    if (err) {
      console.log("error")
     return {
        statusCode: 200,
        body: JSON.stringify("Error in creating signed url"),
    };
    } else {
      console.log("generated "+url)
       return {
        statusCode: 200,
        body: JSON.stringify(url),
      };
    }
  });
  console.log("at end");
  return response;
};

如果在日志语句方面说,那么在语句errorgenerated url at end 之前打印日志语句并返回默认响应。是否有人可以更正此代码以响应在 s3.getSignedUrl 的回调中准备的响应。

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-lambda nodes


    【解决方案1】:

    如果你只是想创建预签名的 url,你可以使用返回 promise 的 getSignedUrlPromise 方法

    exports.handler = async (event) => {
     return s3.getSignedUrlPromise("putObject", {
      Bucket: "my bucket",
      Key: "my file name",
      ContentType: "some file type",
     });
    };
    

    如果您需要自定义响应

      exports.handler = async (event) => {
        return new Promise((resolve, reject) => {
        s3.getSignedUrl(
        "putObject",
        {
            Bucket: "my bucket",
            Key: "my file name",
            ContentType: "some file type",
        },
        (err, url) => {
            if (err) reject(err);
            if (url)
            resolve({
                statusCode: 200,
                body: url,
            });
        });
      });
    };
    

    【讨论】:

      【解决方案2】:

      目前最简单的方法是将 Promise API 用于 aws-sdk,然后等待 getSignedUrl

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 2017-02-15
        • 2016-10-24
        • 1970-01-01
        相关资源
        最近更新 更多