«Неопределенное» свойство json

#typescript #firebase #google-cloud-functions

# #typescript #firebase #google-cloud-функции

Вопрос:

Я использую облачные функции Firebase и использую их только для отправки уведомлений, поэтому я хотел создать класс для упрощения создания этих уведомлений (json-подобных объектов), но при доступе к свойству этого json-подобного объекта он возвращает undefined .

Класс выглядит следующим образом:

 class Notification 
{
    title: string
    body: string

    constructor(t: string, b: string)
    {
        this.title = t
        this.body = b
    }

    Message = 
    {
        "notification":
        {
            "title": this.title,
            "body": this.body
        }
    }
}
 

При прямом доступе к переменной title она возвращает правильное значение, пример:

 let newNotification = new Notification("TITLE", "BODY")
console.log(newNotification.title) // logs -> TITLE
 

Но при доступе к заголовку сообщения возвращает undefined:

 console.log(newNotification.Message.notification.title) // logs -> undefined
 

Текущий код выглядит следующим образом:

 let newNotification = new Notification ("Title test", "Body test")
console.log(newNotification.title) // logs -> Title test
console.log(newNotification.Message.notification.title) // logs -> undefined
admin.messaging ().sendToTopic (topic, newNotification.Message)
.then (topicNotificationMessage =>
{
    console.log("Notification OK")
    response.send("Notification OK")
})
.catch (notificationError =>
{
    console.log (notificationError)
    response.send("Notification Error"   notificationError)
})
 

Консоль Firebase регистрирует это:

Ошибка ошибки уведомления: полезная нагрузка сообщения содержит недопустимое значение для свойства «notification.title». Значения должны быть строками.

Полная ошибка:

 { Error: Messaging payload contains an invalid value for the "notification.title" property. Values must be strings.
    at FirebaseMessagingError.Error (native)
    at FirebaseMessagingError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseMessagingError (/user_code/node_modules/firebase-admin/lib/utils/error.js:253:16)
    at /user_code/node_modules/firebase-admin/lib/messaging/messaging.js:615:27
    at Array.forEach (native)
    at /user_code/node_modules/firebase-admin/lib/messaging/messaging.js:612:32
    at Array.forEach (native)
    at Messaging.validateMessagingPayload (/user_code/node_modules/firebase-admin/lib/messaging/messaging.js:605:21)
    at /user_code/node_modules/firebase-admin/lib/messaging/messaging.js:442:37
  errorInfo: 
   { code: 'messaging/invalid-payload',
     message: 'Messaging payload contains an invalid value for the "notification.title" property. Values must be strings.' },
  codePrefix: 'messaging' }
 

Я, честно говоря, не знаю, что я делаю не так.

Ответ №1:

Я думаю, у вас может возникнуть проблема с уровнем, с которого вызывается ваш метод «уведомления». Он не видит значения того, что вы ожидаете от this.title . Я также предполагаю, что если бы вы отбросили this.title, это также дало бы вам нулевое значение для this.body. Метод уведомления имеет свой собственный заголовок и переменную body, и они не заданы. Я не уверен, каково решение, поскольку прошло много лет с тех пор, как я делал подобные вещи.

Ответ №2:

Ты прав, @Elijah.

Я изменил его следующим образом, и теперь он работает:

 class Notification 
{
    constructor(t: string, b: string)
    {
        this.Message.notification.title = t
        this.Message.notification.body = b
    }

    Message = 
    {
        "notification":
        {
            "title": "",
            "body": ""
        }
    }
}