Website-Suche

typescript - s3.putObject() lädt Datei auf S3 hoch, gibt dann aber nie eine Antwort zurück?


import AWS from 'aws-sdk';
const s3 = new AWS.S3();

export async function putObjectToS3(
  data: any,
  nameOfFile: string,
  contentType: string
) {
  const params = {
    Bucket: process.env.S3_BUCKET || '',
    ContentType: contentType,
    Key: `${nameOfFile}`,
    Body: data
  };

  console.log('start s3 put object');
  const response = await s3.putObject(params).promise();

  console.log('end s3 put object: ', response);
  return response;
}


await putObjectToS3(artistsCsv, `artists/artists.csv`, 'text/csv');

Wir haben die folgende Funktion, die eine Datei zu AWS S3 hochlädt. Dies wird in einer AWS Lambda-Funktion ausgeführt. Während unsere artistsCsv-Datei erfolgreich hochgeladen wird (wir sehen die CSV-Datei in S3), gibt die Funktion nie zurück... Wir sehen das Log 'start s3 put object' in unseren Aufzeichnungen, aber wir sehen niemals 'end s3 put object: ', response.

Gibt es etwas falsch an der Art, wie wir diese Funktion gebaut haben, das dazu führt, dass sie nie das response zurückgibt? Wir verwenden aws-sdk Version "aws-sdk": "^2.1147.0".

Könnte dies einfach ein Problem mit AWS sein? (scheint jedoch unwahrscheinlich). Vielleicht etwas mit .promise() und async/await, das wir übersehen? Wie können wir das überhaupt beheben?

Antwort #1

Sie können die Upload-Methode verwenden, wenn putObject nicht funktioniert. Sie unterstützt Promises seit Version 2.6.12 (https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md#2612), also sollte so etwas funktionieren:

const response = await s3.upload(uploadParams).promise();
console.log('end s3 put object: ', response);

Sie können auch ein vollständiges Beispiel aus der Originaldokumentation hier finden (es ist mit Callback, aber das Konzept ist dasselbe):
https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javascript/example_code/s3/s3_upload.js

Verwandte Artikel