Firebase云计划功能无法在控制台上打印任何内容

问题描述

几个小时前我问了这个问题。该问题仅得到部分回答,然后结束,因此我认为再次发布是合理的。

问题 我创建了一个Firebase云功能,该功能每分钟运行一次,以更新Cloud Firestore中的某些数据。正如我在前端所测试的那样,代码的逻辑是正确的。但是,在部署功能之后,除了在部署时收到的2条通知消息外,firebase控制台上没有任何记录。此外,控制台上也没有记录错误。感谢@Doug Stevenson给出的答案,我现在知道firebase仿真器当前不支持调度功能,因此我无法使用仿真器测试该功能。我对错误代码感到困惑。

index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const serviceAccount = require('./ServiceAccountKey.json')
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
})

exports.scheduledFunction = functions.pubsub.schedule('every 1 minute').onRun((context) => {
    var rooms = [];
    var open;
    console.log("start");
    const db = admin.firestore();
    db.collection("rooms").get().
    then((query) => {

        console.log(query.docs);
        ......
    })
})

package.json

{
  "name": "functions","description": "Cloud Functions for Firebase","scripts": {
    "serve": "firebase emulators:start --only functions","shell": "firebase functions:shell","start": "npm run shell","deploy": "firebase deploy --only functions","logs": "firebase functions:log"
  },"engines": {
    "node": "8"
  },"dependencies": {
    "firebase-admin": "^8.10.0","firebase-functions": "^3.6.1"
  },"devDependencies": {
    "firebase-functions-test": "^0.2.0"
  },"private": true
}

解决方法

如果您提供了一些Cloud Functions日志来分析正在发生的事情,那就更好了。但是,从您的代码中,我们可以看到您的Cloud Function中存在两个潜在问题:

  1. firebase-admin通常应在Cloud Functions运行时内不带任何参数的情况下初始化。参见https://firebase.google.com/docs/functions/beta-v1-diff?authuser=0#new_initialization_syntax_for_firebase-admin
  2. 您不会返回异步get()方法返回的Promise,该方法在计划的Cloud Function(以及所有后台触发的函数)中是关键的。参见https://firebase.google.com/docs/functions/terminate-functions

因此,以下方法可以解决问题:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

exports.scheduledFunction = functions.pubsub.schedule('every 1 minute').onRun((context) => {
    var rooms = [];
    var open;
    console.log("start");
    const db = admin.firestore();
    return db.collection("rooms").get()
        .then((querySnapshot) => {

            console.log(querySnapshot.docs);
            //......
            return null;  // Or a promise returned by another async method call
        })
});