Клиент получает ошибку 502, несмотря на успешное создание отчетов Lambda. - PullRequest
2 голосов
/ 17 мая 2019

Ответ 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...

Конечный лямбда-код:

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}

Обратите внимание, что браузер сначала отправляет запрос OPTIONS, который возвращает 200, а затем отправляет GET, который возвращает 502.

1 Ответ

0 голосов
/ 17 мая 2019

s3.getSignedUrl не разрешался до тех пор, пока лямбда не закончила разрешать, поэтому обратный вызов никогда не разрешался.Мне нужно было обернуть 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));
});
...