проблема с получением данных из Firestore в Firebase Functions - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь перехватить обновление документа и отправить уведомление всем пользователям, но значение catch У меня возникли проблемы с его анализом.

в console.log () это данные перехвата :

{ createdAt: Timestamp { _seconds: 1586881980, _nanoseconds: 0 },
  messages: 
   [ { content: 'Un nuevo comienzo para tod@s!\n:)\n?\n:-P\n?',
       createdAt: [Object],
       displayName: 'Fer...',
       photoUrl: 'https://lh3.googleusercontent.com/...',
       uid: 'IJchaq...' },
     { content: '?',
       createdAt: [Object],
       displayName: 'IMP...',
       photoUrl: 'https://lh3.googleusercont...' } 
       ...

и это моя функция:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
admin.initializeApp();

// const db = admin.firestore();
const fcm = admin.messaging();

export const sendToTopic = functions.firestore
  .document("chats/{chatsId}")
  .onUpdate((change, context) => {

    const newValue = change.after.data();

    // console.log(newValue);

    let latestMessage = newValue.messages[0]; // newValue gives me object is possibly 'undefined'

    const payload: admin.messaging.MessagingPayload = {
      notification: {
        title: "New Message",
        body: latestMessage,
        icon:
          "https://www.dropbox...",
        clickAction: "FLUTTER_NOTIFICATION_CLICK",
      },
    };

    return fcm.sendToTopic("globalChat", payload);
  });

как мне получить последнее displayName и контент из newValue?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Я решил это, изменив на newValue?messages[0];

1 голос
/ 22 апреля 2020

РЕДАКТИРОВАТЬ: удалили мое предыдущее решение, потому что оно появилось новые ошибки в соответствии с комментариями @fenchai. Суть проблемы, конечно, связана со значениями в машинописи, которые могут быть нулевыми или неопределенными. Typescript попросит вас проверить их на нуль.

Я углубился в это, и в этом сообщении SF было больше разъяснений: { ссылка }

Как отмечает @fenchai, вы можете использовать? оператор.

Ознакомьтесь с примечаниями к выпуску Typescript по состоянию на конец 2019 года: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

Интересующие объекты:

Необязательная цепочка:

// Make x = foo.bar(). If foo null or undefined, x will be undefined.
let x = foo?.bar()

Nulli sh Объединение:

// Makes x equal to foo, or if it is null/ undefined, call bar(). 
let x = foo ?? bar();

С точки зрения функций firebase, я все равно рекомендую всем, чтобы они проверяли важные переменные на ноль перед вызовом дополнительного кода, как вы это сделаете у вас есть возможность выяснить важные ошибки, так как функции firebase могут не всегда сообщать вам, какое значение не определено и причина проблемы root.

Пример:

const message = myDocument?.data()?.message;
if (message === null || message === undefined){
    console.error("Message is undefined or null");
    // Proceed, or return if message vital to function.  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...