【发布时间】:2019-01-26 18:47:21
【问题描述】:
我有一个 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');
}
【问题讨论】:
-
该错误消息的意思是字面上的意思:您的代码在它已经完成之后尝试发送标头。我希望它是
send('OK'),因为这可能会强制输出流的主体变为文本,其中 zip 文件将作为二进制文件发送。 -
删除'send('ok')'。会不会有什么不良影响?
-
我无法为您回答这个问题,因为这取决于接收 zip 的客户端。但是我能很快想到的客户端在接收二进制文件时不会在正文中寻找
OK字符串。这当然值得一试,然后看看:1) 文件现在是否已发送给您的客户,2) 客户是否按照您希望的方式处理它。
标签: node.js firebase express google-cloud-functions