0

我用的NodeJS作爲託管在火力功能來查詢我的火力數據庫後端的,我有這樣的代碼:火力地堡數據庫查詢抽出太多的時間在雲功能

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分鐘),我就會把圖片波紋管:

execution time

而該對象這並不是說大可言,像100行,4頁我不認爲它應該花費那麼多,可能我做錯了什麼,但是在哪裏?我還必須編寫一個承諾或回調,以便在前端發送該標籤var響應,導致函數完成之前,我得到任何價值的標籤(見圖片),我來自一個PHP背景和這個異步JavaScript的概念,這對我來說是非常新的。

回答

2

您沒有向客戶端發回任何響應,這意味着該函數將保持運行狀態直到超時。從它的很難說多少

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); 
    }); 
    }); 
}); 

旁白:

爲了確保功能只運行,只要需要,發送一個響應時已加載數據的客戶端。請記住,雲功能處於測試階段,並且不斷變化,我們無法知道這是冷啓動還是熱啓動,我們無法看到您的項目檢查發生了什麼。

如果您想在此獲得更多幫助,我建議您嘗試在更容易排除故障的環境中重現問題。例如,您可以使用本地node.js進程重現perfor問題嗎?

+0

非常感謝你的回覆,這真是太好了,我真的很喜歡firebase,所有的尊重你的團隊!回到代碼,我有response.status(200).send(JSON.stringify(tags));最後,但我的錯誤是我把它放在函數範圍之外,函數完成了,我沒有任何對象,但移動響應發送函數內部使它工作,小修改,出於某種原因,我得到Cors錯誤,如果我res.status(200)。發送(標籤);但我改變了response.status(200).send(tags);和工作,關於查詢速度現在看起來不錯,我會更多地測試,謝謝! –

+1

錯字很好。我更新了我的答案以解決問題。 –