【问题标题】:Node function not executing some lines in lambda节点函数未在 lambda 中执行某些行
【发布时间】:2021-05-26 12:56:16
【问题描述】:

我已经编写了一个 lambda 函数来将文件复制到另一个 s3 存储桶并从当前存储桶中删除该对象,但是它在某行被弯腰并且在那之后没有执行。我尝试了以下两个选项,第一个停止在第二个完成但响应没有到达 API 网关代理

    var AWS = require("aws-sdk");
    
    
    // Main Lambda entry point
    exports.handler = async (event) => {
          await getUploadURL(event);
          
            var responseBody = {
            "status": "success",
            "message": "The file was successfully moved"
        };
            const response = {
            "statusCode": 200,
            "headers": {
                "Content-Type": "application/json",
                "Access-Control-Allow-Headers": "Content-Type",
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Methods": "OPTIONS,POST,GET,DELETE"
            },
            "body": JSON.stringify(responseBody),
            "isBase64Encoded": false
        };
        return response;
      };
    
    const getUploadURL = async function(event) {
        console.log("invoking lambda starting");
        var s3 = new AWS.S3();
        var sourceBucket = "sourcebucket";
        var destinationBucket = "destbucket";
        var objectKey = event.queryStringParameters.fileName;
        console.log("Object Key", objectKey);
        //Only execute till here after that no execution log
        var copySource = encodeURI(sourceBucket + "/" + objectKey);
        var copyParams = {
            Bucket: destinationBucket,
            CopySource: copySource,
            Key: objectKey
        };
        var deleteParams = {
            Bucket: sourceBucket,
            Key: objectKey
        };
       /** var responseBody = {
            "status": "success",
            "message": "The file was successfully marked as read"
        };
        var failedResponseBody = {
            "status": "Failed",
            "message": "The file was not copied"
        };**/
      await s3.copyObject(copyParams, function (err, data) {
            console.log("Starting Copying function");
            if (err) {
                console.log("error occured during copy", err, err.stack);
            } else {
                console.log("The copy was successful, response");
            }
        });
    
        await s3.deleteObject(deleteParams, function (err, data) {
            console.log("Deleting the file from S3");
            if (err)
                console.log(err, err.stack); // error
            else
                console.log("Deleted the File from S3"); // deleted
                
              
        });
    
        
    };

我尝试了另一个带有回调的选项,它正在工作,但 lambda 没有返回正确的响应。文件已移动,但对 API 网关的响应为空。 API 抱怨 502 无效响应

 var AWS = require("aws-sdk");
exports.handler = (event, context, callback) => {
    console.log("invoking lambda starting")
    var s3 = new AWS.S3();
    var sourceBucket = "source";
    var destinationBucket = "destination";
    var objectKey = event.queryStringParameters.fileName
    console.log("Object Key", objectKey)
    var copySource = encodeURI(sourceBucket + "/" + objectKey);
    var copyParams = {
        Bucket: destinationBucket,
        CopySource: copySource,
        Key: objectKey
    };
    var deleteParams = {
        Bucket: sourceBucket,
        Key: objectKey
    }
    var responseBody = {
        "status": "success",
        "message": "The file was successfully marked as read"
    };
    var failedResponseBody = {
        "status": "Failed",
        "message": "The file was not copied"
    };
   s3.copyObject(copyParams, function (err, data) {
        console.log("Starting Copying function");
        if (err) {
            console.log("error occured during copy", err, err.stack);
        } else {
            console.log("The copy was successful, response", response);
        }
    });

    s3.deleteObject(deleteParams, function (err, data) {
        console.log("Deleting the file from S3");
        if (err)
            console.log(err, err.stack); // error
        else
            console.log("Deleted the File from S3"); // deleted
    });


    const response = {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Headers": "Content-Type",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET,DELETE"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
    return callback(response);
};

【问题讨论】:

  • 能否正确格式化您的代码?这真的很难阅读和理解,因为你的行的缩进是混淆的。

标签: node.js amazon-web-services aws-lambda aws-api-gateway


【解决方案1】:

现在只是快速检查,但我可以看到以下问题:

示例代码 1: 您正在混合使用回调和等待/异步样式。如果您想使用 async/await,请使用以下模式:

const copyResult = await s3.copyObject(props).promise();
const deleteResult = await s3.deleteObject(props2).promise();
// ...

示例代码 2:您的代码正在使用回调,但您正在继续使用您的代码,而无需等待回调发生。使用这种模式:

exports.handler = (event, context, callback) => {
  const props = { ... };
  s3.copyObject(props, (err, data) => {
    if (err) {
      // ...
    } else {
      const props2 = { ... };
      s3.deleteObject(props2, (err2, data2) => {
        if (err2) {
          // ...
        } else {
          callback(response);
        }
      });
    }
  });
}

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2017-11-22
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多