[英]Firebase Cloud Functions - get origin from context in https callable function
[英]Proper way to return stream from Firebase callable function (Cloud function)?
从 Firebase 可调用 function 返回 stream 的正确方法是什么? 我希望它表现得像一个代理并直接返回响应 stream 。 目前,我等待响应和 append 它们如下所示。 我认为这不是正确的方法,因为它不会直接返回 stream 。
const axios = require('axios');
const functions = require("firebase-functions");
const {PassThrough} = require("stream");
exports.create = functions.https.onCall(async(data, context) => {
const options = {
method: 'POST',
url: '...someurl',
,
responseType: 'stream'
};
const response = await axios(options)
const chunks = response.data.pipe(new PassThrough({encoding:'base64'}));
// then we use an async generator to read the chunks
let str = '';
for await (let chunk of chunks) {
str += chunk;
}
return str;
}
如果您有权访问云存储桶,您可以将数据上传到桶,生成下载 URL 并将您的 HTTP 请求重定向到下载链接
//using admin sdk and express
import * as admin from "firebase-admin";
const bucket = admin.storage().bucket('<bucket name>');
await bucket.file('<filename>').save(data).catch();
bucket.file('<filename>').getSignedURL({
action: 'read',
expires: Date.now() + 600000, //expires in 10 minutes
}).then(url => {
response.redirect(url[0]); //redirect to download URL
}).catch(error => {
console.log(error);
})
您必须更改存储权限设置以验证下载 URL 创建和访问。 您可以在 firebase 上的存储项目类别的rules
部分执行此操作
service firebase.storage {
match /b/{bucket}/o {
match /<bucket name>/{allPaths=**} {
allow read: if true;
allow write: if request.auth != null; //all other locations are secured by auth
}
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
确保将<bucket name>
替换为您的存储桶的名称。 此规则允许任何人从数据桶中读取数据,但未经授权不得写入数据桶。 所有其他位置都是安全的。 如果您要存储机密信息,请不要使用此权限解决方法,并通过正确的身份验证确保下载 URL 创建。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.