繁体   English   中英

从 Firebase 可调用 function(云功能)返回 stream 的正确方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM