Búsqueda de sitios web

typescript - Funciones en la nube de Firebase Objeto posiblemente 'indefinido'


Tengo el siguiente código en TypeScript y obtengo este error en la línea: change.after.data();, El objeto posiblemente es '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)
})

lo que quiero hacer es enviar a mi aplicación una notificación cada vez que algo en Firestore cambie, seguí la documentación oficial pero obtengo un error, creo que esto tiene que ver con la versión de node.js. ¿Alguien puede ayudar, por favor?

Respuesta #1

Tu parámetro change es de tipo Change. Si haces clic en él en VSCode, verás su definición aquí:

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

Observe que sus propiedades before y after son ambas opcionales, marcadas con un ? en el tipo. Esto significa que es posible que los valores estén indefinidos.

Es probable que tu configuración de TypeScript en tsconfig.json contenga una línea para "strict": true, lo que le indica a TypeScript que no te advierta cada vez que intentes acceder a una propiedad que podría ser indefinida sin verificarla explícitamente primero. Ese es el error que estás viendo aquí.

Tienes dos opciones:

1) Elimina esa línea de tu tsconfig.json

2) O verifica primero si está definido

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

Respuesta #2

Si miras los tipos para el manejador onUpdate, el argumento para change tiene 2 propiedades opcionales, after y before:

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

Porque quieres acceder a after, necesitarás envolverlo en una condicional, algo como lo siguiente:

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

Artículos relacionados