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
