【问题标题】:Cannot read property get of undefined Firebase functions无法读取未定义 Firebase 函数的属性获取
【发布时间】:2020-04-09 23:33:27
【问题描述】:

我正在尝试创建一个函数,该函数将在文档是否更新时发送通知。

我在更新文档时访问该文档,并获得更新该文档的用户 ID 和我需要的状态,之后,我只查询用户设备令牌并发送有效负载,但似乎不起作用,我真的不知道代码的语法是否有错误或我的回调有问题。

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

 {service keys are initialized here}     

    exports.onOrderCreated = functions.firestore
    .document('orders/{orderId}').onUpdate(async (snap,context) => {

        var db = admin.firestore();

        try{
            const orderDataSnap = await snap.ref.get();
            var userId = orderDataSnap.data().uid;
            var orderStatus = orderDataSnap.data().status;
        }catch(error){
            return handleErrorToUser(error,snap);
        }

        let docRef = db.collection('user').doc(userId);

       return docRef.get().then(userDoc => {
           const deviceToken = userDoc.get('deviceToken')
           const payload = {
            "data": {
                "title": "Your order status here !",
                "body": "Your order status is:"+orderStatus,
                "icon": "ic_launcher",
                "sound": "default",
                "click_action": "delete_token"
              }

            }
            return admin.messaging().sendToDevice(deviceToken,payload)
      });
    });

    // Inform about errors (these errors are for testing purposes, we should use StackDriver to log the errors 
    // to ourselves and let a friendly user error message with this function)
    async function handleErrorToUser(tError, snap) {
        console.log(tError)
      }

内部订单我必须获取这两个属性

uid 和状态

然后,使用该 uid,在用户引用中获取 deviceToken。

这段代码给了我

 TypeError: Cannot read property 'get' of undefined
>     at exports.onOrderCreated.functions.firestore.document.onUpdate (/srv/index.js:17:46)
>     at cloudFunction (/srv/node_modules/firebase-functions/lib/cloud-functions.js:131:23)
>     at /worker/worker.js:825:24
>     at <anonymous>
>     at process._tickDomainCallback (internal/process/next_tick.js:229:7)

我对 javascript 没有太多经验,任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: javascript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    这里有一些问题。

    首先,onUpdate 函数的第一个参数的名称应该snap。正如您在documentation for onUpdate 中看到的那样,第一个参数是一个更改对象,其中包含文档“之前”和“之后”状态的文档快照,因为发生了更新。该 Change 对象没有有一个名为 ref 的属性,这会导致您的代码失败。

    其次,如果您希望此代码获取已更新的文档:

    const orderDataSnap = await snap.ref.get();
    

    这里完全没有必要,因为文档的内容已经在我之前提到的 Change 对象中传递。只需使用您提供的数据,除非您确定它不会是您想要的。

    我建议查看文档以更好地了解更新触发器的工作原理。

    【讨论】:

      【解决方案2】:

      我认为问题出在这一行:

      const deviceToken = userDoc.get('deviceToken')
      

      如果'deviceToken'令牌是来自文档数据的一个属性,你应该首先运行data方法,它返回所有文档数据属性:

      const deviceToken = userDoc.data().deviceToken
      

      【讨论】:

        猜你喜欢
        • 2018-10-30
        • 2018-04-01
        • 2020-03-26
        • 2018-09-13
        • 1970-01-01
        • 2019-03-18
        相关资源
        最近更新 更多