Firebase Cloud Functions对象可能“未定义”

时间:2019-03-14 16:02:16

标签: typescript firebase google-cloud-functions

我在打字稿中有以下代码,并且在行上遇到此错误:change.after.data();,对象可能是'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)
})

enter image description here 我想要做的是每当Firestore中的某些内容发生更改时向我的应用发送通知,我遵循了官方文档,但出现错误,我认为这与node.js版本有关。有什么帮助吗?

2 个答案:

答案 0 :(得分: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();
        ...
    }
}

答案 1 :(得分:1)

您的change参数的类型为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;
}