GetObject () не работает после обновления времени выполнения с Nodejs6.1 до Nodejs8.1 - PullRequest
1 голос
/ 19 апреля 2019

Я использую AWS Lambda со средой выполнения NodeJS, и недавно я получил уведомление от AWS о том, что они прекратят поддерживать lambdas во время выполнения node.js 6.10.

В основном я пытаюсь получить объекты из S3 и создать поток из этих объектов для извлечения данных из файла xlsx.

Это код, который я пытаюсь выполнить внутри своей лямбды. Этот кусок кода работал во время выполнения 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 Ответ

1 голос
/ 09 мая 2019

Проблема связана с использованием этой функции внутри lambda.Я не получил ни ошибки, ни результата, потому что как только lambda прекратил свое выполнение, код внутри функции getWorkbookFromS3(s3Params) не мог быть выполнен, поскольку это обещание.

Способ, которым я вызвал эту функциюраньше было так:

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

Но это не сработало.В результате мне пришлось добавить ключевое слово await, чтобы принудительно выполнить promise и предотвратить остановку lambda.

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