使用Nodejs Lambda从S3上的.xlsx文件读取数据

时间:2020-11-02 13:15:46

标签: node.js aws-lambda xlsx

我仍然是NodeJ和AWS的新手,如果这是一个菜鸟问题,请原谅我。

我正在尝试从Excel文件(.xlsx)中读取数据。 lambda函数接收文件类型的扩展名。

这是我的代码:

exports.handler = async (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    if (event.fileExt === undefined) {
        callback("400 Invalid Input");
    }
    
    let returnData = "";
    const S3 = require('aws-sdk/clients/s3');
    const s3 = new S3();
    

    switch(event.fileExt)
    {
        case "plain":
        case "txt":
            // Extract text
            const params = {Bucket: 'filestation', Key: 'MyTXT.'+event.fileExt};
            
            try {
                await s3.getObject(params, function(err, data) {
                  if (err) console.log(err, err.stack); // an error occurred
                  else{           // successful response
                      returnData = data.Body.toString('utf-8');
                      context.done(null, returnData);
                  }
                }).promise();
        
            } catch (error) {
                console.log(error);
                return;
            }  
           
            break;
        case "xls":
        case "xlsx":
            returnData = "Excel";
            // Extract text
            
            const params2 = {Bucket: 'filestation', Key: 'MyExcel.'+event.fileExt};
            const readXlsxFile = require("read-excel-file/node"); 
            
            try {     
                const doc = await s3.getObject(params2);     
                const parsedDoc = await readXlsxFile(doc);     
                console.log(parsedDoc)   
            } catch (err) {     
                console.log(err);     
                const message = `Error getting object.`;     
                console.log(message);     
                throw new Error(message);   
            } 
            
            break;
        case "docx":
            returnData = "Word doc";
            // Extract text
            break;
        default:
            callback("400 Invalid Operator");
            break;
    }
    callback(null, returnData);
};

文本文件部分起作用。但是xlsx部分使函数超时。 我确实安装了read-excel-file依赖项并上传了zip文件,以便可以访问它。 但是函数超时并显示以下消息: "errorMessage": "2020-11-02T13:06:50.948Z 120bfb48-f29c-4e3f-9507-fc88125515fd Task timed out after 3.01 seconds"

任何帮助将不胜感激!谢谢您的时间。

2 个答案:

答案 0 :(得分:0)

我将超时更改为20秒,并且可以正常工作。仅剩下一个问题:const parsedDoc = await readXlsxFile(doc);希望接收字符串(文件路径)而不是文件。

答案 1 :(得分:0)

使用xlsx NPM库解决。使用流并为其提供缓冲区。