简体   繁体   English

如何从 s3 存储桶解析 CSV 以在 javascript AWS Lambda function 中使用

[英]How to parse CSVs from s3 bucket to use in a javascript AWS Lambda function

I'm trying to read in a CSV from an s3 bucket using the csvtojson library in AWS Lambda, but it's not working properly.我正在尝试使用 AWS Lambda 中的 csvtojson 库从 s3 存储桶中读取 CSV,但它无法正常工作。 Locally, my code works.在本地,我的代码有效。 But when I upload it to Lambda, it doesn't return anything.但是当我把它上传到 Lambda 时,它没有返回任何东西。 There are no errors in the Lambda console, so I'm having a hard time debugging. Lambda console 没有错误,所以我调试很费力。 My code is below.我的代码如下。

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

Does csvtojson not work on Lambda for some reason? csvtojson 是否出于某种原因在 Lambda 上不起作用? Should I be using a different method to parse the CSV?我应该使用不同的方法来解析 CSV 吗? Thanks!谢谢!

Your lambda is finishing before the Promise has completed.您的 lambda 在 Promise 完成之前完成。 Replace the last section with this:将最后一节替换为:

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

Use promise to solve this problem.使用 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');
}```

Get CSV content is simple获取CSV 内容很简单
Try this尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从Lambda函数解析AWS S3文件 - How to parse an AWS S3 file from a Lambda function 如何从S3存储桶读取大型XML文件,然后使用AWS Lambda将其用作HTTP请求正文 - How to read a large XML file from S3 bucket and then use it as an HTTP request body using AWS Lambda 如何将 .wav 从 lambda 函数中的 URL 保存到 s3 存储桶 - How to save .wav to s3 bucket from URL in lambda function AWS Lambda函数无法将json更新到s3存储桶 - AWS Lambda function to updload json to s3 bucket not working 尝试从 Nodejs 中的 AWS Lambda 函数读取 S3 存储桶的内容时未获得结果 - Not getting results when attempting to read the content of an S3 bucket from AWS Lambda function in Nodejs 当S3存储桶中的getObject时,对AWS Lambda函数的访问被拒绝 - Access denied on aws lambda function when getObject from S3 bucket 如何使用带有Lambda函数的Node.js在AWS S3存储桶中创建嵌套文件夹? - How to create nested folders in aws s3 bucket using nodejs with lambda function? 如何将 Zip 文件从 s3 存储桶下载到 node.js lambda 函数中的本地目录 - How to download Zip File from an s3 bucket to a local directory within a node.js lambda function 如何将 AWS S3 用于 npm 注册表(nodeJs AWS Lambda) - How to use AWS S3 for npm registry (nodeJs AWS Lambda) 代码管道将S3存储桶作为用户参数传递给AWS中的lambda函数 - Code pipeline passing S3 bucket as User Parameters to lambda function in AWS
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM