在AWS API Gateway Lambda nodejs处理程序上解析event.body时出错

时间:2019-05-06 19:28:38

标签: amazon-web-services

是否有任何标准方法可以解析AWS Lambda中的AWS API 事件内容?

我有这样的lambda nodejs(处理程序)功能。此功能由AWS API Gateway代理集成调用。简而言之,代理集成将http请求原样传递给lambda。

exports.handler = async(event, context, callback) => {
...
}

我的活动将包含图像或文档。换句话说,就目前使用Postman而言,我通过HTTP Post方法将内容上传到AWS API Url。 然后,我想调用包含内容的AWS S3上传。

按原样,如果我们使用JSON.stringify,则事件对象包含这些内容

{
    "resource": "/UploadToS3",
    "path": "/UploadToS3",
    "httpMethod": "POST",
    "headers": {
        "Accept": "*/*",
        "accept-encoding": "gzip, deflate",
        "Cache-Control": "no-cache",
        "Content-Type": "multipart/form-data; boundary=--------------------------286169661413777803563037",
        "Host": "rzm85vjr13.execute-api.us-east-1.amazonaws.com",
        "Postman-Token": "84182d22-7193-480f-8642-0fede39b4458",
        "User-Agent": "PostmanRuntime/7.11.0",
        "X-Amz-Date": "20190506T191534Z",
        "X-Amzn-Trace-Id": "Root=1-5cd087d7-73a9f50e5b2c20a2628852fb",
        "X-Forwarded-For": "100.18.45.29",
        "X-Forwarded-Port": "443",
        "X-Forwarded-Proto": "https"
    },
    "multiValueHeaders": {
        "Accept": [
            "*/*"
        ],
        "accept-encoding": [
            "gzip, deflate"
        ],
        "Cache-Control": [
            "no-cache"
        ],
        "Content-Type": [
            "multipart/form-data; boundary=--------------------------286169661413777803563037"
        ],
        "Host": [
            "rzm85vjr13.execute-api.us-east-1.amazonaws.com"
        ],
        "Postman-Token": [
            "84182d22-7193-480f-8642-0fede39b4458"
        ],
        "User-Agent": [
            "PostmanRuntime/7.11.0"
        ],
        "X-Amz-Date": [
            "20190506T191534Z"
        ],
        "X-Amzn-Trace-Id": [
            "Root=1-5cd087d7-73a9f50e5b2c20a2628852fb"
        ],
        "X-Forwarded-For": [
            "100.18.45.29"
        ],
        "X-Forwarded-Port": [
            "443"
        ],
        "X-Forwarded-Proto": [
            "https"
        ]
    },
    "queryStringParameters": null,
    "multiValueQueryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
        "resourceId": "f80gn4",
        "resourcePath": "/UploadToS3",
        "httpMethod": "POST",
        "extendedRequestId": "ZRopnE9AIAMF2ig=",
        "requestTime": "06/May/2019:19:15:35 +0000",
        "path": "/test/UploadToS3",
        "accountId": "364714536632",
        "protocol": "HTTP/1.1",
        "stage": "test",
        "domainPrefix": "rzm85vjr13",
        "requestTimeEpoch": 1557170135135,
        "requestId": "5319988d-7033-11e9-a592-f9fb3565e98f",
        "identity": {
            "cognitoIdentityPoolId": null,
            "accountId": null,
            "cognitoIdentityId": null,
            "caller": null,
            "sourceIp": "100.18.45.29",
            "principalOrgId": null,
            "accessKey": null,
            "cognitoAuthenticationType": null,
            "cognitoAuthenticationProvider": null,
            "userArn": null,
            "userAgent": "PostmanRuntime/7.11.0",
            "user": null
        },
        "domainName": "rzm85vjr13.execute-api.us-east-1.amazonaws.com",
        "apiId": "rzm85vjr13"
    },
    "body": "----------------------------286169661413777803563037\r\nContent-Disposition: form-data; name=\"test\"; filename=\"b002.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n**CONTENT GOES HERE**\r\n",
    "isBase64Encoded": false
}

如果我说 event.body ,这就是我们得到的。为了简洁起见,我已经减少了很多图像数据(所有图像数据都在 image / jpeg ---- 之间)。

----------------------------286169661413777803563037
Content-Disposition: form-data; name="test"; filename="b002.jpg"
Content-Type: image/jpeg

����JFIF��C         

----------------------------286169661413777803563037--

我必须以某种方式对此进行解析,以获取图像的内容以及可能的类型。 此内容看起来像是HTTP请求的摘录。 如果我按原样使用此内容并将其传递给S3.upload,则以后打开它的格式不是很好。

我在网上看到的一些例子有一些库。 有人可以解释一下为什么我需要这些库来提取S3上传或某些其他功能所需的内容。

1 个答案:

答案 0 :(得分:0)

对于将图像上传到S3存储桶的情况,您需要考虑将图像作为Base64传递(使用upload或PutObject方法)。因此,根据我的经验,我可以分享一些注意事项:

  • 首先,删除图像数据之前的标题。 (您可以找到/(正斜杠)或“ ... / jpeg”进行分隔)例如。
...\r\nContent-Type: image/jpeg\r\n\r\n����\u0000\u0010JFIF\u0000\u0001\u00...
  • 通过Postman发送图像时,event.body中的编码不正确,因此在上传到存储桶之前,必须将其转换为Base64。如果不这样做,图像将成功上传但损坏,并且将无法看到任何内容(您会看到一个奇怪的空白框)。在Node.js中,您可以使用Buffer.from(yourstring, 'base64')来执行它。

  • 不要忘记在s3上传方法的参数中包含“ ContentType”:“ image / jpeg”。