如何解析 s3 存储桶中的 CSV 以在 JavaScript AWS Lambda 函数中使用



我正在尝试使用 AWS Lambda 中的 csvtojson 库从 s3 存储桶中读取 CSV,但它无法正常工作。在本地,我的代码有效。但是当我将其上传到 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 吗?谢谢!

您的 lambda 在承诺完成之前就完成了。将最后一节替换为以下内容:

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

使用 promise 来解决这个问题。

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');
}```

获取 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");
}

最新更新