Firebase function not executed

16 浏览
0 Comments

Firebase function not executed

在控制台上,我已经部署了这个函数并且可以看到它。但是当数据库中的totalScore更新时,函数并没有被执行...

0
0 Comments

问题原因:代码中指定了错误的监听器类型,应该指定为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]`,这些错误是由于参数的类型没有明确指定导致的。可以通过明确指定参数类型来解决这些错误。

0
0 Comments

问题原因:代码中的更新检查是在ref上进行,而不是在child上进行。

解决方法:

尝试修改代码如下:

export const onMessageCreate = functions.database
.ref('/users/{userId}')
.onUpdate((change) => {
    console.log('I am a log entry2!');
    //var a = admin.firestore().collection('/users');
})

在该位置获取快照的旧值和新值,但仍然没有执行,尽管`totalScore`已经改变。

0
0 Comments

问题出现的原因是数据库是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]

我们在聊天中继续讨论

0