【问题标题】:Client receiving 502 error despite Lambda logs reporting success尽管 Lambda 日志报告成功,但客户端仍收到 502 错误
【发布时间】:2019-05-16 21:07:32
【问题描述】:

API 响应

body: ReadableStream
bodyUsed: true
headers: Headers
__proto__: Headers
ok: false
redirected: false
status: 502
statusText: ""
type: "cors"
url: "correct-url"
__proto__: Response

但是 Lambda 的日志报告它正在返回一个有效的响应:

2019-05-16T20:40:54.113Z    some-id-snipped { statusCode: 200,
 correct headers and body...

结束 Lambda 代码:

s3.getSignedUrl('putObject', s3Params, (err, data) => {
  if (err) {
    localLogger.log(err);
    callback(null, failure(err, localLogger));
  } else {
    const response = { url: data, fileName };
    callback(null, success(response, localLogger));
  }
});

还有那个成功方法:

export function success(body, logger = console) {
  const response = {
    statusCode: 200,
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Credentials": true
    },
    body: JSON.stringify(body)
  };
  logger.log(response);
  return response;
}

无服务器上传定义:

getUploadUrl:
  handler: src/resourceImages.getUploadUrl
  events:
    - http:
        path: resourceImages/getUploadUrl
        method: get
        cors: true
        authorizer:
          arn: ${self:provider.environment.USER_POOL_ARN}

请注意,浏览器首先发送一个返回 200 的 OPTIONS 请求,然后发送一个返回 502 的 GET。

【问题讨论】:

    标签: node.js aws-lambda serverless-framework pre-signed-url bad-gateway


    【解决方案1】:

    s3.getSignedUrl 直到 lambda 完成解析后才解析,因此回调从未解析。我需要将 s3.getSignedUrl 包装在一个承诺中以使其工作:

    function getSignedUrlPromise(s3Params) {
      const s3 = new AWS.S3({ signatureVersion: 'v4', });
    
      return new Promise(function(resolve, reject) {
        s3.getSignedUrl('putObject', s3Params, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      })
    }
    
    await getSignedUrlPromise(s3Params).then((response) => {
      const data = { url: response, fileName };
      callback(null, success(data, localLogger));
    }).catch((err) => {
      localLogger.log(err);
      callback(null, failure(err, localLogger));
    });
    

    【讨论】:

    • 我使用了 async 和 await,这个问题也为我解决了,奇怪的是它在没有 async 和 await 的情况下在本地工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2015-08-10
    相关资源
    最近更新 更多