Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使Lambda函数等待异步操作完成?_Node.js_Amazon Web Services_Amazon S3_Aws Lambda_Nodes - Fatal编程技术网

Node.js 如何使Lambda函数等待异步操作完成?

Node.js 如何使Lambda函数等待异步操作完成?,node.js,amazon-web-services,amazon-s3,aws-lambda,nodes,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,Nodes,我对NodeJS和AWS Lambda都是新手。我正在创建一个lambda函数来获取S3PUT对象的预签名URL。我在这里面临的问题是,calls3.getSignedUrl是一个异步进程,它在回调中响应已签名的URL,但在这个调用响应之前,lambda函数控制在这个调用之后到达下一行,并且在客户端接收到空响应。这是我的lambda函数代码片段 exports.handler = async (event) => { // Some stuff like reading input

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


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


如果说在日志语句方面,则在语句
错误之前
生成的url
末尾
将打印日志语句,并返回默认响应。是否有人可以更正此代码以响应在
s3的回调中准备的响应。getSignedUrl

目前最简单的方法是使用aws sdk的Promise API,如果您只是想创建预签名的url,只需等待
getSignedUrl
,您可以使用返回承诺的
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,
        });
    });
  });
};

谢谢,很好用。