Firebase 云函数对象可能“未定义”

Posted

技术标签:

【中文标题】Firebase 云函数对象可能“未定义”【英文标题】:Firebase Cloud Functions Object possibly 'undefined' 【发布时间】: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) 【参考方案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();
        ...
    

【讨论】:

以上是关于Firebase 云函数对象可能“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数 - 发送推送并收到错误消息“TypeError:无法将未定义或 null 转换为对象”[关闭]

Firebase 云函数错误:函数返回未定义、预期的 Promise 或值

firebase 云函数无法读取未定义的属性“ref”

firebase云函数错误TypeError:无法读取未定义的属性“子”

Firebase 云函数 - 返回未定义、预期的 Promise 或值

解决一堆承诺时出现 Firebase 错误:无法将未定义或 null 转换为对象