Node.js 从云功能中下载zip流

Node.js 从云功能中下载zip流,node.js,firebase,express,google-cloud-functions,Node.js,Firebase,Express,Google Cloud Functions,我有一个firebase云函数,它使用express将图像的zip文件流式传输到客户端。当我在本地测试云函数时,它工作得很好。当我上传到firebase时,出现以下错误: 错误:发送邮件后无法设置邮件头 是什么导致了这个错误?内存限制 export const zipFiles = async(name, params, response) => { const zip = archiver('zip', {zlib: { level: 9 }}); const [file

我有一个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'); 
}
export const zipFiles=async(名称、参数、响应)=>{
const-zip=archiver('zip',{zlib:{level:9}});
const[files]=wait storage.bucket(bucketName).getFiles({前缀:`${params.agent}/${params.id}/deliveries`});
if(files.length){
附件(`${name}.zip`);
setHeader('Content-Type','application/zip');
response.setHeader('Access-Control-Allow-Origin','*'))
压缩管(输出);
on('close',function(){
返回输出。发送('OK')。结束();//{
const reader=storage.bucket(bucketName).file(file.name).createReadStream();
append(读取器,{name:`${name}-${i+1}.jpg`});
});
zip.finalize();
}否则{
状态(404).send('notfound');
}

Frank在评论中说的是真的。在开始发送任何内容正文之前,您需要确定所有标题,包括HTTP状态响应

如果您想表示您正在发送成功的响应,只需说
output.status(200)
与您处理404错误的方式相同。请提前完成。当您正在传送响应时,您不需要做任何事情来关闭最终响应。当传送完成时,响应将自动刷新并最终确定。您只需在希望尽早退出时打电话,而无需立即发送响应l


请记住,云函数只支持10MB()的最大负载,因此,如果您试图压缩的负载超过这个总负载,它将不起作用或者根本就是分块响应。整个有效负载被构建在内存中,并作为一个单元传输出去。

该错误消息的字面意思是:您的代码正在尝试发送一个标头,但它已经完成了。我希望它是
发送('OK'))
,因为这可能会迫使输出流的正文变成文本,其中zip文件将作为二进制文件发送。删除“send('ok'))“。不会有任何负面影响吗?我不能为您回答这个问题,因为这取决于接收zip的客户端。但我能很快想到的客户端在接收二进制文件时并不是在正文中寻找
OK
字符串。这当然值得一试,然后看看:1)文件现在是否发送给您的客户端,2)如果客户端nts按照您希望的方式处理它。好吧,废话。我正在尝试构建~100MB的zip。您有没有其他方法可以建议如何解决这个问题?将zip写回存储,给他们一个直接的URL,然后安排稍后将其删除。