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