【问题标题】:Firebase database querying taking to much time in Cloud FunctionFirebase 数据库查询在 Cloud Function 中花费大量时间
【发布时间】:2017-09-27 09:03:04
【问题描述】:

我使用 nodejs 作为托管在 firebase 函数上的后端来查询我的 firebase 数据库,我有以下代码:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const cors = require('cors')({origin: true});
admin.initializeApp(functions.config().firebase);
const express = require('express')


exports.getAjax = functions.https.onRequest((request, response) => {
    cors(request, response, () => {
        console.log("request.body :", JSON.stringify(request.body)); 
        console.log("request.query :", JSON.stringify(request.query));


        var date = {
          startDate: request.body.startDate,
          endDate: request.body.endDate
        }
        var db = admin.database();
        var logsDbPath = 'logs';
        var usersDbPath = 'users';
        var ref = db.ref(logsDbPath);
        var tags;
        db.ref(usersDbPath).once('value').then(function(tagsSnapshot) {
          tagsSnapshot.forEach(function(tagSnapshot) {
            var tagId = tagSnapshot.key;
            tagSnapshot.forEach(function(sessSnapshot) {
              var userSessId = sessSnapshot.key;
              var userInfo = sessSnapshot.val();
            });
          });

          tags = JSON.parse(JSON.stringify(tagsSnapshot.val()));
          console.log(tags);
        });
    });
});   

我的主要问题是console.log(tags); 在这种情况下实际完成查询并获取标签的值大约需要 38 秒(有时需要大约 1 分钟),我将把图片放在下面:

而且那个对象根本没有那么大,就像 100 行,每行有 4 个属性,我不认为它应该占用那么多,可能我做错了什么,但是在哪里?,我还必须写一个承诺或一个回调,以便在前端发送该标签 var 响应,导致函数在我获得标签上的任何值之前完成(见图),我来自 PHP 背景,这个异步 javascript 概念对我来说很新。

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您没有向客户端发送任何响应,这意味着该函数将继续运行直到超时。

    为确保函数仅在需要时运行,请在加载数据后向客户端发送响应:

    exports.getAjax = functions.https.onRequest((request, response) => {
      cors(request, response, () => {
        console.log("request.body :", JSON.stringify(request.body)); 
        console.log("request.query :", JSON.stringify(request.query));
    
    
        var date = {
          startDate: request.body.startDate,
          endDate: request.body.endDate
        }
        var db = admin.database();
        var logsDbPath = 'logs';
        var usersDbPath = 'users';
        var ref = db.ref(logsDbPath);
        var tags;
        db.ref(usersDbPath).once('value').then(function(tagsSnapshot) {
          tagsSnapshot.forEach(function(tagSnapshot) {
            var tagId = tagSnapshot.key;
            tagSnapshot.forEach(function(sessSnapshot) {
              var userSessId = sessSnapshot.key;
              var userInfo = sessSnapshot.val();
            });
          });
    
          tags = JSON.parse(JSON.stringify(tagsSnapshot.val()));
          console.log(tags);
    
          // Send the response to the client, which also ends the function
          response.status(200).send(tags);
        });
      });
    });   
    

    除此之外,很难说太多。请记住,Cloud Functions 处于测试阶段并且不断变化,我们无法知道这是冷启动还是热启动,而且我们无法查看您的项目来检查正在发生的事情。

    如果您想在此处获得更多帮助,我建议您尝试在对故障排除更友好的环境中重现问题。例如,您能否重现本地 node.js 进程的性能问题?

    【讨论】:

    • 非常感谢您的回复,真是太荣幸了,我真的很喜欢 firebase,对你们所有的团队都应有的尊重!回到代码,我有 response.status(200).send(JSON.stringify(tags));最后但我的错误是我把它放在函数范围之外,函数完成并且我没有任何对象,但是在函数内部移动响应发送使它工作,小的修改,由于某种原因,如果我得到 cors 错误res.status(200).send(标签);但我改变了 response.status(200).send(tags);并且工作,关于查询速度现在看起来不错,我会更多地测试它,谢谢!
    • 很好地抓住了错字。我更新了我的答案来修复它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2022-01-23
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多