问题描述
几个小时前我问了这个问题。该问题仅得到部分回答,然后结束,因此我认为再次发布是合理的。
问题 我创建了一个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中存在两个潜在问题:
-
firebase-admin
通常应在Cloud Functions运行时内不带任何参数的情况下初始化。参见https://firebase.google.com/docs/functions/beta-v1-diff?authuser=0#new_initialization_syntax_for_firebase-admin - 您不会返回异步
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
})
});