Firebase function not executed
问题原因:代码中指定了错误的监听器类型,应该指定为Cloud Firestore的监听器,而非Realtime Database的监听器。
解决方法:从functions中提取firestore,并指定要监听的文档路径。修改代码如下:
import * as functions from 'firebase-functions'; const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); export const onMessageCreate = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { console.log(change.before.data()); // shows the document before update console.log(change.after.data()); // shows the document after change return; })
这个Cloud Function可能无法正确部署,因为路径`users/{userId}/{documentId}`是错误的。应该将`{documentId}`删除。
对于错误`Parameter 'change' implicitly has an 'any' type. [7006]`、`'context' is declared but its value is never read. [6133]`和`Parameter 'context' implicitly has an 'any' type. [7006]`,这些错误是由于参数的类型没有明确指定导致的。可以通过明确指定参数类型来解决这些错误。
问题出现的原因是数据库是Firestore,但是使用的云函数是由实时数据库的更新触发的。这是两个不同的Firebase服务,需要相应地更改代码。
解决方法如下:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.onMessageCreate = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { // 获取代表文档的对象 const newValue = change.after.data(); // ...或者在此更新之前的值 const previousValue = change.before.data(); if (newValue.totalScore !== previousValue.totalScore) { console.log('NEW TOTAL SCORE'); } return null; // 我猜你不只是打印到控制台。 // 如果你执行任何异步操作,应返回相应的Promise,参见下面的第3点 // 例如: // if (newValue.totalScore !== previousValue.totalScore) { // return db.collection("score").doc(newValue.name).set({score: newValue.totalScore}); // } });
注意:
1. 当文档的任何字段更改时,无法触发`onUpdate`云函数。只有当Firestore文档的任何字段更改时,云函数才会触发。但是你可以检测到哪些字段已更改,如上面的代码所示。
2. 从版本1.0开始,需要使用`admin.initializeApp();`进行初始化,参见https://firebase.google.com/docs/functions/beta-v1-diffList。
3. 你需要告知平台何时云函数执行完成:由于在云函数中没有执行任何异步操作,可以使用`return null;`。关于这一点的更多细节,建议你观看Firebase视频系列中关于"JavaScript Promises"的3个视频:https://firebase.google.com/docs/functions/video-series/。
你是如何尝试触发它的?你是通过更新现有的`totalScore`节点来触发的吗?
我已经上传了一个节点的图片。
好的,现在我明白了!你的数据库是Firestore,但是你使用的云函数是由实时数据库的更新触发的。这是两个不同的Firebase服务。我会更新我的回答。
我一直收到错误:[ts] Parameter 'change' implicitly has an 'any' type. [7006]
和[ts] 'context' is declared but its value is never read. [6133] [ts] Parameter 'context' implicitly has an 'any' type. [7006]
请参考stackoverflow.com/questions/43064221/…
我还收到[ts] Cannot find name 'db'. [2304]
我们在聊天中继续讨论。