我正在尝试获取Firestore集合中的所有文档,其中我的字段referredBy
等于变量refCode
(引用代码)。我继续在Stackdriver中收到错误:“错误:超出了内存限制。函数调用被中断。”
有关此功能的说明,请参见:https://firebase.google.com/docs/firestore/query-data/get-data#get_multiple_documents_from_a_collection
我曾尝试将此云函数的内存分配增加到2 GB(最大),但仍然是相同的错误。此集合中只有两个文档,并且只有一个符合我的“ where”标准,因此文档的大小无论如何都不应该成为问题。
这是从我的index.js:
const express = require('express');
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const app = express();
// Get referred users:
app.get('path/to/myapp', (req, res) => {
var getReferred = require('./getRefUsers');
if (admin.apps.length === 0 ) { admin.initializeApp(functions.config().firebase); }
var db = admin.firestore();
getReferred.getUsersReferred(req, res, db);
});
exports.getReferred = functions.https.onRequest(app);
调用以下函数:
module.exports = {
getUsersReferred: function(req, res, db) {
const { shopName, twitchId } = req.query;
// Get users account to get their referral code:
var docRef = db.collection('stores').doc(shopName).collection('users').doc(twitchId);
docRef.get()
.then((docSnapshot) => {
if (!docSnapshot.exists) {
var msg = 'User ' + twitchId + ' does not exist.';
console.log(msg);
res.json({ 'status': 'error', 'message': msg });
} else {
var referredUsers = [];
// Get all users who were referred by this user
var refCode = docSnapshot.data().referralCode;
console.log('refCode: ' + refCode + ' shop: ' + shopName + ' id: ' + twitchId);
db.collection('stores').doc(shopName).collection('users').where("referredBy", "==", refCode)
.get()
.then(function(querySnapshot) {
console.log('Size: ' + querySnapshot.size);
querySnapshot.forEach(function(doc) {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
var username = doc.data().username;
var earned = doc.data().earnedreferpoints;
var id = doc.data().twitchId;
if (typeof earned == 'undefined' || earned == 'no') {
earned = 'No';
} else {
earned = 'Yes';
}
if (doc.data().referredBy == refCode) {
referredUsers[id] = [username, earned];
}
});
// After assembling json object, send to user:
res.json({ 'status': 'success', 'data': referredUsers} );
})
.catch(function(error) {
var msg = 'Error getting users you have referred. Please contact us.';
console.log(msg + ' ', error);
res.json({ 'status': 'error', 'message': msg });
});
}
})
.catch(function(error) {
var msg = '';
console.log(msg);
res.json({ 'status': 'error', 'message': msg });
});
}
};
该代码永远不会到达
.then()
块。 console.log('Size: ' + querySnapshot.size);
不会打印到Stackdriver日志中。 最佳答案
解决了。
如果有人知道为什么这样做,请告诉我。
因此,在调用Firestore数据库之前,将创建变量var referredUsers = [];
。当我的查询找到匹配项时,它会将这样的数据添加到referredUsers:referredUsers[id] = [username, earned];
,它将referredUsers
视为字典/对象而不是数组。这在我的本地计算机上运行良好,并且将referredUsers打印为:[ <274940135 empty items>, [ 'areliven', 'Yes' ] ]
看起来很奇怪,我不太了解。但是以某种方式这导致我在Firebase云功能中运行时超出了内存限制。
我如何解决它
将var referredUsers = [];
更改为var referredUsers = {};
就是这样!现在,它在本地打印出{ '274940135': [ 'areliven', 'Yes' ] }
,并且可以在Firebase云功能上正常运行。
再说一次,如果有人能阐明这可能导致我超出了Firebase的内存限制,那真是太好了!
关于node.js - 从集合中获取多个文档超出了Firestore内存限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53946999/