Как запретить FCM преобразовывать вложенные объекты json в строку в уведомлениях о сообщениях данных в режиме реагирования

Я использую firebase в своем реактивном проекте (с машинописным текстом), я все правильно настроил, и он отлично работает с сообщениями data, как показано ниже:

{
  "to": "fcm-token",

  "data": {
    "field1": "value1",
    "field2": "value1",
    "field3": "value1"
  }
}

в моем приложении я могу получить доступ к своим данным, используя data поле RemoteMessage, как показано ниже:

const data: MyDataType = remoteMessage.data;
const {/* destructed fields */} = data;

Но, когда мой сервер отправляет вложенный объект на сервер FCM, он преобразует их в строку, и поэтому я не могу получить к ним прямой доступ, как указано выше.

это то, что мой сервер отправляет на сервер FCM:

{
  "to": "fcm-token",

  "data": {
    "field1": {
      "subfield1": "subvalue1",
      "subfield2": "subvalue2",
    },
    "field2": "value1",
    "field3": "value1"
  }
}

и это то, что я получаю в своем приложении:

{
  "to": "fcm-token",

  "data": {
    "field1": "{"subfield1": "subvalue1","subfield2": "subvalue2"}", <--- the problem is here, it must be a nested object not string
    "field2": "value1",
    "field3": "value1"
  }
}

Я установил заголовок Content-Type в application/json в своих запросах на публикацию сервера, поэтому я не думаю, что есть какие-то проблемы с моими заголовками.

Я делаю что-то неправильно? Как я могу запретить FCM преобразовывать мои вложенные объекты?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
5
0
2 003
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

? react-native-firebase автор сюда,

В нашей реализации мы ничего не конвертируем в строки, они уже переходят в родные строки, например, в Android используется класс RemoteMessage FCM, где мы вызываем getData(), который, как вы можете видеть, здесь возвращает только строки.

Я сам обошел это, если я хочу, чтобы вложенные данные имели только одно поле данных, в котором я предоставляю все свои данные в виде одной строки JSON, а затем при ее получении мне нужно только JSON.parse одно поле для вернуть структуру. Например.

const data = {
  "field1": "value1",
  "field2": "value1",
  "field3": {
    "subfield1": "subvalue1",
  }
}

const payload = {
  "to": "fcm-token",
  "data": {
    "json": JSON.stringify(data),
  }
}
const data: MyDataType = remoteMessage.data;
const { field1, field2, field3 } = JSON.parse(data.json);

console.info(field3.subfield1);

В качестве альтернативы вы можете сгладить свой объект данных перед отправкой, используя что-то вроде это, а затем разгладить на принимающей стороне, используя что-то вроде это.

Надеюсь это поможет.

Чтобы избежать ошибок на определенных платформах, убедитесь, что значения соответствуют их форме. То есть в объекте data выше, если value1 является целым числом, вы должны удалить кавычки. То же правило для логического значения

TheLetch 09.02.2021 09:45

Если вы посмотрите документацию для тип сообщения в REST API, вы увидите, что data объявлен как:

"data": {
  string: string,
  ...
},

Таким образом, поле data может содержать только строковые значения, а не более сложные объекты.

Если вы хотите хранить более сложные значения, сначала закодируйте их как строку, а затем декодируйте на клиенте, например, с помощью JSON.stringify() и JSON.parse().

Другие вопросы по теме