ค้นหาเว็บไซต์

typescript - Firebase Cloud Functions วัตถุอาจเป็น 'undefined'


ฉันมีโค้ดต่อไปนี้ใน TypeScript และฉันได้รับข้อผิดพลาดนี้ในบรรทัด: 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)
})

สิ่งที่ฉันต้องการทำคือส่งการแจ้งเตือนไปยังแอปของฉันทุกครั้งที่มีอะไรบางอย่างใน Firestore เปลี่ยนแปลง ฉันได้ทำตามเอกสารอย่างเป็นทางการแล้ว แต่ฉันได้รับข้อผิดพลาด ฉันคิดว่านี่เกี่ยวข้องกับเวอร์ชันของ Node.js ใครช่วยได้บ้าง กรุณา?

คำตอบ #1

พารามิเตอร์ change ของคุณเป็นประเภท Change หากคุณคลิกดูใน VSCode คุณจะเห็นการกำหนดนิยามของมันที่นี่:

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

สังเกตว่าคุณสมบัติ before และ after ของมันทั้งคู่เป็นค่าที่ไม่จำเป็น โดยมีเครื่องหมาย ? ในประเภท ซึ่งหมายความว่าเป็นไปได้ว่าค่าจะไม่ถูกกำหนด

มีความเป็นไปได้ว่าการตั้งค่า TypeScript ของคุณใน tsconfig.json มีบรรทัดสำหรับ "strict": true ซึ่งบอก TypeScript ว่าไม่ต้องเตือนคุณเมื่อคุณพยายามเข้าถึงคุณสมบัติที่อาจเป็น undefined โดยไม่ได้ตรวจสอบอย่างชัดเจนก่อน นั่นคือข้อผิดพลาดที่คุณเห็นที่นี่

คุณมีตัวเลือกสองอย่าง:

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;
}

คำตอบ #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();
        ...
    }
}

บทความที่เกี่ยวข้อง