Поток NodeJS из лямбда-функции AWS - PullRequest
0 голосов
/ 05 ноября 2018

Мы пытаемся перевести наш zip-микросервис с обычного приложения в nodejs Express на AWS API Gateway, интегрированный с AWS Lambda.
Наше текущее приложение отправляет запрос в наш API, получает список вложений, а затем посещает эти вложения и передает их содержимое обратно пользователю в виде zip-архива. Это выглядит примерно так:

module.exports = function requestHandler(req, res) {

  //...
  //irrelevant code
  //...

  return getFileList(params, token).then(function(fileList) {
    const filename = `attachments_${params.id}`;
    res.set('Content-Disposition', `attachment; filename=${filename}.zip`);

    streamFiles(fileList, filename).pipe(res); <-- here magic happens
  }, function(error) {
    errors[error](req, res);
  });
};

Мне удалось сделать все, кроме части, в которой я должен выводить контент из функции Lambda.
Я думаю, что одним из возможных решений является использование aws-serverless-express, но я бы хотел более элегантное решение.

У кого-нибудь есть идеи? Можно ли даже выйти из Lambda?

1 Ответ

0 голосов
/ 05 ноября 2018

К сожалению, лямбда не поддерживает потоки, поскольку события или возвращают значения. (Трудно найти упомянутое явно в документации, за исключением того, что вы заметили, как описываются вызовы и контексты / обратные вызовы в рабочей документации ).

В случае вашего примера вам придется дождаться streamFiles и затем вернуть завершенный результат.

(aws-serverless-express здесь не помогло бы, если вы проверите код, который они ждут, чтобы ваша труба закончила перед возвратом: https://github.com/awslabs/aws-serverless-express/blob/master/src/index.js#L68)

n.b. Здесь есть нюанс, что многие языковые SDK поддерживают потоковую передачу запросов / ответов, однако это означает подключение к потоковому транспорту, например, поток, загружающий полный ответ от лямбды, не прослушивающий поток, излучаемый лямбдой.

...