gpt4 book ai didi

firebase 管理员无法查询大型项目

转载 作者:行者123 更新时间:2023-12-01 06:12:09 25 4
gpt4 key购买 nike

对于大型项目,使用 firebase admin 从云函数中的集合中检索数据失败。我用来从云函数中查询选择的示例代码如下

admin.database().orderByChild('mmyyyy').equalTo(month).once('value');

当我尝试检索 10600 个项目(试图找出原因)时,此调用失败。在谷歌控制台中有这个日志,但没有其他东西可以为我指明正确的方向
textPayload:  "Function execution took 18547 ms, finished with status: 'response error'"   

在多次尝试失败后,我决定尝试使用 firebase sdk 在客户端上执行此调用,如下所示:
result = await firebase.database().ref(`transactions`).orderByChild('mmyyyy').equalTo(month).once('value');

这在客户端上完美运行,没有错误,并返回我所有的项目 17000 个(这个 json 的大小为 26MB)。

为什么会这样?是否有任何未记录的限制?

笔记:
我将云功能内存增加到 1gb,超时时间增加到 5 分钟,但没有帮助。

这是完整的示例代码

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

const cors = require('cors')({
"origin": "*",
"methods": "POST,GET",
"allowedHeaders": "Content-Type,uid,agence,month,course,raceType,raceNumber,status",
"preflightContinue": false,
"optionsSuccessStatus": 204
});

function _findTransactions(agence, month, course, raceType, raceNumber, status) {
return new Promise((resolve, reject) => {
try {
let db = admin.database();

let findPromise = db.ref(`transactions`).orderByChild('mmyyyy').equalTo(month).once('value');

findPromise.then((result) => {

let transactions = result.val();

//removed business logic

resolve(transactions);
}).catch((err) => {
console.log(err);
reject(err);
});
} catch (error) {
console.log(error);
reject(error);
}
});
}

exports.findTransactions = functions.https.onRequest((req, res) => {
let uid;
try {
cors(req, res, () => {
uid = req.headers.uid;
let agence = req.headers.agence;
let month = req.headers.month;
let course = req.headers.course;
let raceType = req.headers.raceType;
let raceNumber = req.headers.raceNumber;
let status = req.headers.status;

if (req.method !== 'GET') {
return handleResponse(req, res, 403);
}

if (!uid || uid == null || uid == undefined) {
return handleResponse(req, res, 401);
}

_validateUserId(uid, ['central_cashier', 'admin'])
.then(() => {
_findTransactions(agence, month, course, raceType, raceNumber, status)
.then((result) => {
return handleResponse(req, res, 200, result);
}).catch((error) => {
return handleResponse(req, res, 500);
});
}).catch((error) => {
return handleResponse(req, res, 401);
});
});
} catch (error) {
return handleError(res, uid, error);
}
});

最佳答案

您的有效载荷太大,为 exceeding the quota for Google Cloud Functions正如你所说。

想到了两个选择:

  • 压缩有效载荷。 在将文件发送到客户端之前对文件进行 Gzip 压缩。使用 Zlib 模块中内置的 NodeJS 很容易,或者;
  • 设置虚拟机 .虚拟机不受这些限制的约束。
  • 关于firebase 管理员无法查询大型项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510125/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com