Как разобрать 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');
}```