标签: google-cloud-functions

如何使用Express功能为Firebase执行HTTP文件上传(multer,busboy)

我正在尝试将文件上传到云功能,使用Express处理那里的请求,但我没有成功.我创建了一个本地工作的版本:

服务器端js

const express = require('express');
const cors = require('cors');
const fileUpload = require('express-fileupload');

const app = express();
app.use(fileUpload());
app.use(cors());

app.post('/upload', (req, res) => {
    res.send('files: ' + Object.keys(req.files).join(', '));
});
Run Code Online (Sandbox Code Playgroud)

客户端js

const formData = new FormData();
Array.from(this.$refs.fileSelect.files).forEach((file, index) => {
    formData.append('sample' + index, file, 'sample');
});

axios.post(
    url,
    formData, 
    {
        headers: { 'Content-Type': 'multipart/form-data' },
    }
);
Run Code Online (Sandbox Code Playgroud)

当部署到云函数时,这个完全相同的代码似乎会中断,其中req.files未定义.有谁知道这里发生了什么?

编辑 我也有一个使用multer,在本地工作得很好,但一旦上传到云功能,这让我得到一个空数组(相同的客户端代码):

const app = express();
const upload = multer();
app.use(cors());

app.post('/upload', upload.any(), (req, res) => {
    res.send(JSON.stringify(req.files));
});
Run Code Online (Sandbox Code Playgroud)

javascript express firebase google-cloud-functions

25
推荐指数
6
解决办法
9609
查看次数

适用于Firebase和Express的云功能

functions.https命名空间的Firebase文档显示该函数接受express.Request对象和express.Response对象.它没有提到你可以传递一个快速服务器对象functions.https.onRequest.但是,我发现人们一直在这样做而且评论者没有明确表示不应该这样做(除了functions-samples回购问题#101线程中的一个人)

看到:

我的问题是:

  1. Firebase或GCP云功能的云功能如何处理在功能定义之外初始化的对象的生命周期?
  2. 以上内容如何影响函数的生命周期?它是否会运行到超时或与AWS Lambda类似的功能?

澄清1和2:在Lambda中,导出函数之外的任何资源都用于同一Lambda实例的所有后续调用,而该函数实例为"暖".这意味着函数的响应时间不会受到任何复杂初始化代码的负面影响,因为每个"热"实例都会执行一次.在这个例子中,它不需要在每个调用时初始化一个ExpressJS服务器,只需要一次函数是"暖".我很好奇云功能是否也这样做?

同样在Lambda中,ExpressJS服务器的存在不会延长函数的执行时间(当它返回完成时),我也很好奇云功能是如何在这里实现的.它是否与Lambda完全相同,或者(因为它可能以不同方式处理现有对象)它是否会执行其他操作?

  1. functions.https.onRequest文件没有规定你可以传递一个ExpressJS服务器对象进去,所以这是怎么工作?那么有两个端点吗?有人能解释一下这里发生了什么吗?

澄清3:我一直看到人们做以下事情:

// './functions/index.js'

var functions = require("firebase-functions");
const express = require("express");

// setup ExpressJS Server
const expressRouter = new express.Router();
expressRouter.get("*", (req, res) => {
  res.send(`Hello from Express in Cloud Functions for Firebase`);
});

// Cloud Function
exports.express = functions.https.onRequest(expressRouter);
Run Code Online (Sandbox Code Playgroud)

并且希望知道这是如何工作的,因为Cloud Functions API仅指定接受functions.https.onRequest(request, response)在ExpressJS API之后建模的params.

这些参数基于Express Request和Response对象 - firebase.google.com/docs/functions/http-events

由于所有问题都与单个代码片段以及这个用例有关,我认为它可以更好地一起回答.

提前致谢 :)

express firebase google-cloud-functions

24
推荐指数
2
解决办法
1万
查看次数

新的Firebase云功能https.onCall触发器更好吗?

随着最新的Firebase Update可调用功能的推出.我的问题是这种新方式是否比"旧"http触发器更快,如果它更安全.

我没有这方面的专业知识,但我认为HTTP与HTTPS可能有所不同.

这对我来说很有意思,因为如果可调用函数更快,它们就具有这种优势,但它们的缺点在于灵活性:其他来源无法达到它们.

如果可调用函数在速度或安全性方面没有优势,我没有理由将其切换.

https http firebase google-cloud-functions

24
推荐指数
1
解决办法
4235
查看次数

在Firestore中删除包含所有子集和嵌套子集的文档

如何删除包含其所有集合和嵌套子集合的文档?(在功能环境中)

在RTDB中,您可以ref.child('../someNode).setValue(null)完成所需的行为.

我可以想到两种方法可以实现所需的删除行为,这两种方式都有可怕的弊端.

  1. 创建一个"超级"功能,它将捕获每个文档并批量删除它们.此函数将变得复杂,易于更改,并且可能需要很长的执行时间.

  2. 为每种Document类型添加'onDelete'触发器,并使其删除任何直接子集合.您将在根文档上调用delete,删除调用将沿'tree'向下传播.由于功能执行的巨大负荷,这种情况非常缓慢,规模庞大且成本高昂.

想象一下,你必须删除一个'GROUP'及其所有孩子.对于#1来说它会非常混乱,而对于#2来说会很昂贵(每个文档有1个函数调用)

groups > GROUP > projects > PROJECT > files > FILE > assets > ASSET
                                                   > urls > URL
                                    > members > MEMBER
               > questions > QUESTION > answers > ANSWER > replies > REPLY
                                      > comments > COMMENT
               > resources > RESOURCE > submissions > SUBMISSION
                                      > requests > REQUEST
Run Code Online (Sandbox Code Playgroud)

是否有一种优越/偏好/更清晰的方式来删除文档及其所有嵌套的子集合?

考虑到你可以从控制台做到这一点应该是可能的.

firebase google-cloud-functions google-cloud-firestore

23
推荐指数
4
解决办法
5659
查看次数

Firebase firestore云功能显示错误:无效使用"undefined"类型作为Firestore参数

我有一个项目将货币详细信息添加到firestore数据库中,我的项目正在使用ionic 3

每当我向集合添加新文档时,触发函数onCreate()将执行并更新名为"updated"的文档.

但触发功能始终显示错误.

Error: Invalid use of type "undefined" as a Firestore argument.
    at Object.exports.customObjectError.val [as customObjectError] (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/validate.js:164:14)
    at Function.encodeValue (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:808:20)
    at Function.encodeFields (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:678:36)
    at Function.fromObject (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/document.js:218:55)
    at WriteBatch.set (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/write-batch.js:291:39)
    at DocumentReference.set (/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/src/reference.js:419:8)
    at Object.<anonymous> (/user_code/lib/index.js:28:10)
    at next (native)
    at /user_code/lib/index.js:7:71
    at __awaiter (/user_code/lib/index.js:3:12)
Run Code Online (Sandbox Code Playgroud)

sombody请帮忙..

我花了很多时间.

这是代码:

import * as functions from 'firebase-functions';

const admin = require('firebase-admin');
admin.initializeApp();

exports.createCurrency = functions.firestore
.document('Exchange/{ExchangeId}')
.onCreate( async (snap, context) => {

const id: string = snap.data().id;
const branchName: string = snap.data().branchName;
const …
Run Code Online (Sandbox Code Playgroud)

javascript firebase google-cloud-functions google-cloud-firestore

23
推荐指数
1
解决办法
1万
查看次数

Firebase 错误:无法获取未定义的运行服务

我正在尝试部署 firebase 功能并收到错误:

错误:无法获取运行服务未定义`

我已经尝试更新 firebase-tools,但没有帮助。您能帮忙解决一下吗?

node.js firebase google-cloud-functions

23
推荐指数
3
解决办法
8799
查看次数

具有Google云功能的Google Cloud端点

我无法找到有关如何将GCF与Google Cloud Endpoints连接的文档.据我所知,可以将Google Cloud Endpoints配置为访问内部云资源.目前尚不清楚如何将负载均衡器与端点服务一起使用.

使用Cloud Datastore构建可伸缩Web应用程序文章中,它表明您应该能够配置从云端点到云功能的直接连接.没有迹象表明您需要在它们之间安装任何计算引擎或其他基础设施.是否有关于如何将云端点连接到云功能的文档或教程?有人设法连接这两项服务吗?

google-cloud-endpoints google-cloud-datastore google-cloud-platform google-cloud-functions

22
推荐指数
1
解决办法
4012
查看次数

Firebase云功能:如何处理连续请求

在使用Firebase(在这种情况下使用Firebase云功能)时,我们必须为每个带宽字节付费.

所以,我想知道我们如何才能处理某个人以某种方式找到我们的端点然后故意(通过脚本或工具)连续请求的情况?

我在互联网上做了一些搜索,但没有看到任何可以帮助.除了这个,但没有真正有用.

firebase google-cloud-functions

22
推荐指数
2
解决办法
2295
查看次数

如何通过firebase函数将数据写入firestore?

我可以很容易地找到如何为firestore事件添加触发器,但是我找不到有关如何使用firebase函数写入firestore的任何文档.

例如,我有以下内容:

export const listener = functions.auth.user().onCreate((x)=>{
    //firestore function to add an entry for user with fields...
})
Run Code Online (Sandbox Code Playgroud)

似乎没有办法做到这一点?将数据添加到firestore的逻辑应该写在客户端吗?如果是这样意味着我不需要为每个平台重写该功能?

firebase typescript google-cloud-functions google-cloud-firestore

22
推荐指数
1
解决办法
9777
查看次数

Cloud Function 会影响 Firebase 存储带宽的使用吗?

我想弄清楚为什么 firebase 存储使用量远远超出我的预期 在此处输入图片说明

我的 Firebase 存储中只有几个照片文件,大约 75 张照片,每张照片 100kb。但是我存储的字节数和对象计数远远超出了我的预期,如上图所示。在这种情况下,也许我可以从此处的文档中找到答案

当您将函数的源代码部署到 Cloud Functions 时,该源代码存储在 Cloud Storage 存储分区中。然后,Cloud Build 会自动将您的代码构建到容器映像中,并将该映像推送到 Container Registry。当 Cloud Functions 需要运行容器来执行您的函数时,它会访问此映像。

构建图像的过程是完全自动的,不需要您的直接输入

可能是因为我创建了很多云函数。这就是为什么我的 Firebase 存储中存储的字节数和对象计数很大的原因

现在我需要知道为什么存储带宽在一个月内高达 20.2 GB。我仍在开发我的应用程序,用户就是我。我不认为我会在一个月内达到 20.2 GB,因为在我的 Android 应用程序中,我在显示图像时使用缓存。

我很怀疑,我的存储带宽使用率过高的原因是云功能。八月,我firebase deploy对我的云功能执行了很多操作。Cloud Function 会影响 Firebase 存储带宽的使用吗?

我在印度尼西亚,我的 Firebase Storage 和 Firestore 位于 asia-southeast2,但我的 Cloud Function 位于 asia-east2。我的云功能对我的 firestore 和存储中的图像执行一些操作。但我仍然认为它不会达到每月 20.2 GB

从上图可以看出,带宽使用分为 3 个不同的部分

  1. asia.artifacts.projectID.appspot.com
  2. gcf-sources-5900904-asia-east2
  3. projectID.appspot.com

asia.artifacts.projectID.appspot.com 似乎远远高于其他,它高达 4.3 GB

那是我的问题的一些信息。所以我需要知道,云功能部署/操作会影响我的 Firebase 存储带宽使用吗?

我需要了解为什么会发生这种情况,因为我担心如果很多用户使用我的应用程序会产生意外的成本。

firebase google-cloud-functions firebase-storage

22
推荐指数
1
解决办法
2126
查看次数