Как разобрать CSV из корзины s3 для использования в функции JavaScript AWS Lambda

Я пытаюсь прочитать CSV из ведра s3 с помощью библиотеки csvtojson в AWS Lambda, но она не работает должным образом. Локально мой код работает. Но когда я загружаю его в Lambda, он ничего не возвращает. В консоли Lambda нет ошибок, поэтому мне сложно отлаживать. Мой код ниже.

const AWS = require('aws-sdk');
const csvtojson = require('csvtojson');

const s3 = new AWS.S3();

const params = {
   Bucket: bucketName,
   Key: pathToFile 
};

const stream = s3.getObject(params).createReadStream();

csvtojson()
   .fromStream(stream)
   .then((json) => {
     console.log('Locally, this returns the CSV as JSON. On Lambda, it does not.');
   });

Csvtojson по какой-то причине не работает на Lambda? Следует ли мне использовать другой метод для анализа CSV? Спасибо!

3 ответа

Ваша лямбда заканчивается раньше, чем обещание завершено. Замените последний раздел следующим:

const json = await csvtojson().fromStream(stream);
console.log('Locally, this returns the CSV as JSON. On Lambda, it does not.');

Получить CSV-контент очень просто
Попробуйте это

      export async function getS3Object(
  bucket: string,
  key: string,
  s3: Pick<S3, "getObject">
): Promise<string> {
  const { Body } = await s3
    .getObject({
      Bucket: bucket,
      Key: key,
    })
    .promise();
  if (!Body) {
    throw new Error(`S3: Empty body for ${bucket} - ${key}`);
  }

  return Body.toString("utf-8");
}

Используйте обещание, чтобы решить эту проблему.

import * as AWS from 'aws-sdk';
const s3 = new AWS.S3();
const csv = require('@fast-csv/parse');


const params = {
    Bucket: 'bucket name',
    Key: 'uploads/img-links.csv'
};

const csvFile = s3.getObject(params).createReadStream();


let csvParsePromise = new Promise((resolve, reject) => {

    const parser = csv.parseStream(csvFile, { headers: true }).on("data", function (data) {
        parser.pause();  // can pause reading using this at a particular row
        console.log('One line from .csv >> ', data);
        parser.resume(); // to continue reading
    }).on("end", function () {
        resolve('csv parse process finished')
    }).on("error", function () {
        reject('csv parse process failed')
    });
});

try { await csvParsePromise; }
catch(err) {
    console.log('an error has occurred');
}```
Другие вопросы по тегам