【问题标题】:Firebase Cloud Functions Object possibly 'undefined'Firebase 云函数对象可能“未定义”
【发布时间】:2019-08-05 14:47:40
【问题描述】:

我在 typescript 中有以下代码,我在线上收到此错误:change.after.data();, Object is posibbly 'undefined':

import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'

admin.initializeApp()

export const onEditModeUpdate = 
functions.firestore.document("Settings/ShiftsEditMode").onUpdate(change=> {
    const after = change.after.data();
    const payload = {
        data: {
            temp: String(after.temp),
            conditions: after.conditions
        }
    }
    return admin.messaging().sendToTopic("Settings/ShiftsEditMode", payload)
})

我想要做的是每当firestore中的某些内容发生变化时向我的应用程序发送通知,我遵循了官方文档但我收到了错误,我认为这与node.js版本有关。请帮忙?

【问题讨论】:

  • 对象可能是'未定义'.ts(2532)

标签: typescript firebase google-cloud-functions


【解决方案1】:

您的change 参数属于更改类型。如果你在 VSCode 中点击它,你会在这里看到它的定义:

export declare class Change<T> {
    before?: T;
    after?: T;
    constructor(before?: T, after?: T);
}

请注意,它的beforeafter 属性都是可选的,在类型中标有?。这意味着这些值可能是未定义的。

tsconfig.json 中的 TypeScript 配置很可能包含 "strict": true 的一行,它告诉 TypeScript 在您尝试访问可能未明确检查的未定义属性时不会警告您。这就是您在此处看到的错误。

你有两个选择:

1) 从 tsconfig.json 中删除该行

2) 或者检查是否先定义

if (change.after) {
    const after = change.after.data();
    const payload = {
        data: {
            temp: String(after.temp),
            conditions: after.conditions
        }
    }
    return admin.messaging().sendToTopic("Settings/ShiftsEditMode", payload)
}
else {
    return null;
}

【讨论】:

  • 非常感谢,我在社交网络上关注您的教程。再次感谢它成功了:)
  • 对于使用 Firebase CLI 创建的项目来说,默认添加的 strict: true 是最近才出现的,而我的教程实际上并没有使用它。因此,今天的默认设置不再与教程匹配,这有点令人遗憾。
  • 如果可能,另一件事是,当我更改数据时,我在函数日志中收到此错误:消息负载包含“data.conditions”属性的无效值。值必须是字符串。
  • 这听起来完全不同。请发布一个关于该问题的单独问题。
【解决方案2】:

如果您查看 onUpdate 处理程序的类型,change 的参数有 2 个可选属性,afterbefore

class Change<T> {
    before?: T;
    after?: T;
    constructor(before?: T, after?: T);
}

因为你想访问after,你需要将它包装在一个条件中,如下所示:

functions.firestore.document("Settings/ShiftsEditMode").onUpdate(change=> {
    if (change.after) {
        const after = change.after.data();
        ...
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2018-03-28
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多