загрузите большой объект javascript в виде файла json на aws s3 (эффективный способ)

#javascript #node.js #json #amazon-s3 #aws-lambda

Вопрос:

Привет, у меня есть ответ json, вероятно, размером 150-200 МБ. Из-за его размера я хочу сохранить его на aws s3 в виде файла json вместо того, чтобы возвращать его клиенту. Ниже приведен код, который я использую в настоящее время.

 async function uploadFileOnS3(fileData, s3Detail) {
  const params = {
    Bucket: s3Detail.Bucket,
    Key: s3Detail.Key_response,
    Body: JSON.stringify(fileData), // big fat js object
  };
  try {
    const stored = await S3.upload(params).promise();
    console.log("file uploaded Sucessfully ", stored);
  } catch (err) {
    console.log(err);
  }
  console.log("upload exit");
}
 

Меня беспокоит операция JSON.stringify(файловые данные). предполагая, что эта функция будет частью aws lambda, не потребуется ли огромных ресурсов для ее анализа в виде строки?

существует ли какой-либо другой эффективный способ сохранить объект javascript в виде json в корзине aws s3?

Ответ №1:

На самом деле вам не нужно структурировать файл JSON. Вы можете передать поток как тело:

 async function uploadFileOnS3(fileData, s3Detail) {
    const params = {
        Bucket: s3Detail.Bucket,
        Key: s3Detail.Key_response,
        Body: fileData, // remove stringify from here
    };
    try {
        const stored = await S3.upload(params).promise();
        console.log("file uploaded Sucessfully ", stored);
    } catch (err) {
        console.log(err);
    }
    console.log("upload exit");
}

exports.handler = async (event) => {
    // We create a stream
    const stream = fs.createReadStream("/tmp/upload.json");

    // Pass the stream to the upload function
    await uploadFileOnS3(stream, {
        Bucket: "bucket_name",
        Key_response: "upload.json"
    });
}