我正在尝试获取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/

10-10 20:01