如何使用云函数中的response.sendFile从云存储发送文件?

时间:2019-01-31 16:40:14

标签: firebase google-cloud-storage google-cloud-functions

我正在尝试使用来自Firebase云功能的http触发器将响应发送回客户端。 当我使用Cloud Storage中的文件位置发送响应时,sendFile方法会引发以下错误:

"path must be absolute or specify root to res.sendFile"

res.sendFile(obj.path(param1, param2, param3, param4));

obj.path(参数1,参数2,参数3,param4)此建立一个路径GS://或HTTPS://与PARAMS

然后我决定这样做:

const rp = require("request-promise");

exports.fun = functions.https.onRequest( async (req, res) => {
let extResponse = await rp('firebase storage location');
          extResponse.pipe(res);
});

rp现在返回此错误:

StatusCodeError: 403 - "{\n  \"error\": {\n    \"code\": 403,\n    \"message\": \"Permission denied. Could not perform this operation\"\n  }\n}"

此错误是因为云存储需要请求,以便让服务下载从存储区的文件进行认证。

有没有一种方法,使这项工作,并返回该文件返回给客户端?

1 个答案:

答案 0 :(得分:2)

sendFile不起作用,因为它不理解URL。它仅了解本地文件系统上的文件。您应该使用Cloud Storage SDK for node来执行此操作。创建一个File对象,该对象指向您要发送的文件,在其上打开一个读取流,然后将该流传递给响应:

const file = ... // whatever file you want to send
const readStream = file.createReadStream()
readStream.pipe(res)