Потоковая загрузка zip из облачных функций - PullRequest
0 голосов
/ 26 января 2019

У меня есть облачная функция Firebase, которая использует Express для потоковой передачи zip-файла изображений на клиент. Когда я тестирую облачную функцию локально, она работает нормально. Когда я загружаю в firebase, я получаю эту ошибку:

Ошибка: невозможно установить заголовки после их отправки.

Что может быть причиной этой ошибки? Ограничение памяти?

export const zipFiles = async(name, params, response) => {


  const zip = archiver('zip', {zlib: { level: 9 }});


  const [files] = await storage.bucket(bucketName).getFiles({prefix:`${params.agent}/${params.id}/deliverables`});

  if(files.length){
    response.attachment(`${name}.zip`);
    response.setHeader('Content-Type', 'application/zip');
    response.setHeader('Access-Control-Allow-Origin', '*')

    zip.pipe(output);

    response.on('close', function() { 
      return output.send('OK').end(); // <--this is the line that fails
  });

  files.forEach((file, i) => {

    const reader = storage.bucket(bucketName).file(file.name).createReadStream();
    zip.append(reader, {name: `${name}-${i+1}.jpg`});

  });
  zip.finalize();
}else{
  output.status(404).send('Not Found'); 
}

1 Ответ

0 голосов
/ 26 января 2019

То, что Фрэнк сказал в комментариях, верно.Вы должны решить все свои заголовки, включая ответ о статусе HTTP, прежде чем начать отправку какого-либо тела содержимого.

Если вы хотите выразить, что отправляете успешный ответ, просто скажите output.status(200) inтак же, как вы сделали для вашей ошибки 404.Сделай это заранее.Когда вы отправляете ответ, вам не нужно ничего делать, чтобы закрыть ответ в конце.Когда конвейер завершен, ответ автоматически сбрасывается и завершается.Вы должны вызывать end () только в том случае, если вы хотите выйти из системы раньше, не отправляя ответ вообще.

Имейте в виду, что облачные функции поддерживают максимальную полезную нагрузку только 10 МБ ( Узнайте больше об ограничениях ), поэтому, если вы пытаетесь сжать больше, чем это общее количество, это не сработает.На самом деле, нет потоковых или чанкованных ответов вообще.Вся полезная нагрузка создается в памяти и передается как единое целое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...