Firebase Time Out的云功能与错误响应

时间:2017-11-02 07:00:57

标签: firebase firebase-realtime-database google-cloud-functions

新手问题:每次运行云功能都会超时。

此外,它仅在函数日志中返回ONE值,这是第一个userId,而不是它的子节点。我假设这是因为它正在调用.once,但它在forEach循环中,所以我不确定它想要什么。

Firebase数据库

-items
---- userId0123456789
   ---- randomKey987654321
       -- itemName
       -- itemDate
       -- itemType
---- userId987654321
   ---- randomKey012345678
       -- itemName
       -- itemDate
       -- itemType

这是功能代码......

  const key = req.query.key;

  **let userID = 'xxxxx';
  let ikey = 'xxx';**

  var dbRef = admin.database().ref('/items/{userID}/{ikey}');

                dbRef.once("value", function(snapshot) {
                  snapshot.forEach(function(child) {
                    console.log(child.key+": "+child.val());
                  });
                });

更新:这是整个功能,现在它只是暂停而没有响应。

'use strict';

// Firebase Functions
const functions = require('firebase-functions');
// Firebase Admin
const admin = require('firebase-admin');


// Default admin firebase configuration
admin.initializeApp(functions.config().firebase);

const rp = require('request-promise');
const promisePool = require('es6-promise-pool');
const PromisePool = promisePool.PromisePool;
const secureCompare = require('secure-compare');
const MAX_CONCURRENT = 3;

//Initial function call:
exports.CheckItemTypeinFB = functions.https.onRequest((req, res) => {


const key = req.query.key;


// Exit if the keys don't match
if (!secureCompare(key, functions.config().cron.key)) {
 console.log('The key provided in the request does not match the key set in    the environment. Check that', key,
    'matches the cron.key attribute in `firebase env:get`');
res.status(403).send('Security key does not match. Make sure your "key" URL query parameter matches the ' +
    'cron.key environment variable.');
return;
}



  // Try the database here...

  let userID = 'xxx';
  let ikey = 'xxxxx
  //create database ref
  let ref = admin.database().ref(`/items/${userID}/${ikey}`);
                //do a bunch of stuff



  ref.once("value", function(snapshot) {
        snapshot.forEach(function(child) {
            console.log(`${child.key}: ${child.val()}`);
        });
        res.send(200, {/* response data */});
    });




  //send back response
  // res.redirect(200);


})  // END THE MAJJOR CONTAINER THINGS


 //  Returns an access token using the Google Cloud metadata server. */
function getAccessToken(accessToken) {
 // If we have an accessToken in cache to re-use we pass it directly.
  if (accessToken) {
    return Promise.resolve(accessToken);
 }

  const options = {
   uri: 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token',
  headers: {'Metadata-Flavor': 'Google'},
  json: true
 };

  return rp(options).then(resp => resp.access_token);

}

非常感谢帮助。

更新即可。超时是固定的,它返回“/ items”下数据库中的userId。但是,如果我使用$ {userId} / $ {key},我什么也得不到。我仍然无法告诉如何让孩子们在数据库中的随机userId下,并且我读过的其他帖子都没有解释它。 Firebase的文档声明使用{userId}来获取该通配符下的所有内容,但它不起作用。我错过了什么?

1 个答案:

答案 0 :(得分:0)

您没有返回once函数的结果或根本没有返回,因此该函数不知道何时完成超时。

let userID = 'xxxxxxxxx';
let key = 'xxxxxxxx';
let ref = admin.database().ref(`/items/${userID}/${key}`);

return ref.once("value", function(snapshot) {
    snapshot.forEach(function(child) {
        console.log(`${child.key}: ${child.val()}`);
    });
});

另请注意,您正在观察的引用将为您提供特定用户项的子项(itemNameitemDateitemType)。如果您想要属于特定用户的项目,请将参考路径调整为/items/${userID}

在HTTP触发器内部,您可以在观察值后发送响应。

exports.CheckItemTypeinFB = functions.https.onRequest((req, res) => {
    ...
    ref.once("value", function(snapshot) {
        snapshot.forEach(function(child) {
            console.log(`${child.key}: ${child.val()}`);
        });
        res.send(200, {/* response data */});
    });
});