从Nodejs6.1升级到Nodejs8.1的运行时更新后,GetObject()不起作用

时间:2019-04-19 14:07:12

标签: node.js typescript aws-lambda fs aws-sdk-js

我正在AWS Lambda上使用NodeJS运行时,最近我收到AWS的通知,通知他们将停止维护lambdasnode.js 6.10运行时上运行。

基本上,我试图从S3获取对象并从这些对象创建流,以便从xlsx文件中提取数据。

这是我要在lambda内部执行的代码。此代码块在node.js 6.10运行时中起作用,但在node.js 8.10运行时中不起作用。

function getWorkbookFromS3(s3Params): Promise<XLSX.WorkBook> {
    return new Promise((resolve, _reject) => {
        const buffers = [];
        S3Service.getObject(s3Params).createReadStream()
        .on('error', (error) => {
            console.log(error);
        }).on('data', (chunk) => {
            buffers.push(chunk);
        }).on('end', () => {
            const buffer = Buffer.concat(buffers);
            const workbook = XLSX.read(buffer, { type: 'buffer', cellDates: true });
            resolve(workbook);
        })
    });
}

关于如何解决此问题的任何线索?

1 个答案:

答案 0 :(得分:0)

问题与在lambda中使用此函数有关。我没有得到任何错误,也没有得到任何结果,因为一旦lambda停止执行,函数getWorkbookFromS3(s3Params)内的代码就无法执行,因为它是一个承诺。

我之前调用此函数的方式如下:

getWorkbookFromS3(s3Params).then((d) => {
    // do someting
});

但是没有用。结果,我不得不添加一个await关键字以强制执行promise并阻止lambda停止执行。

await getWorkbookFromS3(s3Params).then((d) => {
    // do someting
});