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);
请注意,它的before
和after
属性都是可选的,在类型中标有?
。这意味着这些值可能是未定义的。
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 个可选属性,after
和 before
:
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云函数错误TypeError:无法读取未定义的属性“子”