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

Я использую 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 конвертировать мои вложенные объекты?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

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

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

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

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

1 голос
/ 29 мая 2019

? react-native-firebase здесь автор,

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

У меня получается, что если я хочу, чтобы вложенные данные содержали только одно поле данных, в котором все мои данные представлены в виде одной строки JSON, то при получении их мне нужен только JSON.parse a одно поле, чтобы вернуть структуру. Э.Г.

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.log(field3.subfield1);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...