【发布时间】:2018-03-12 14:47:25
【问题描述】:
对于大型项目,使用 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);
}
});
【问题讨论】:
-
您能否分享出现此问题的完整最小功能代码?
-
我看到了同样的问题。我使用 Google Datastore 作为 GCF 的后端。当查询很小(Function execution took 23318 ms, finished with status: 'response error' 并且客户端浏览器从服务器收到 502 错误。将 GCF 内存增加到 1GB 并将客户端 (axios) 超时增加到 4 分钟并没有帮助。
-
如果我将实体数组切片()为 10,000 个元素,一切正常。注销 Express
res对象:看起来也不错。我也在响应中返回 CORS 标头。我正在使用“简单”CORS(无飞行前选项) -
还尝试使用
Node.js 8 (Beta)选项部署我的功能。没有帮助。 -
在尝试返回大型 json 字符串时遇到与 Python 3.7 Cloud Functions 相同的问题。
标签: firebase firebase-realtime-database google-cloud-functions firebase-admin