GetObject() не работает после обновления во время выполнения с Nodejs6.1 на Nodejs8.1

#node.js #typescript #aws-lambda #fs #aws-sdk-js

#node.js #машинописный текст #aws-lambda #фс #aws-sdk-js

Вопрос:

Я использую AWS Lambda с NodeJS runtime, и недавно я получил уведомление о 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. пожалуйста, укажите вывод ошибки

2. Дело в том, что нет вывода ошибки…

3. Вы уверены, что используемая вами версия xlsx поддерживает Node.js 8.10?

4. Не на 100%, но дело в том, что включенные прослушиватели событий createReadStream() даже не вызываются.

Ответ №1:

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

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

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

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

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