typescript - Hur man förhindrar att FCM konverterar nästlade json-objekt till strängar i Data Message-notifikationer i react-native


Jag använder Firebase i mitt React Native-projekt (med TypeScript), jag har ställt in allt korrekt och det fungerar bra med data-meddelanden som nedan:

{
  "to": "fcm-token",

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

I min app kan jag komma åt mina data med hjälp av data-fältet i RemoteMessage enligt nedan:

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

Men när min server skickar ett nästlat objekt till FCM-servern, konverterar den dem till strängar och därför kan jag inte komma åt dem direkt som ovan.

detta är vad min server skickar till FCM-servern:

{
  "to": "fcm-token",

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

och detta är vad jag får i min ansökan:

{
  "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"
  }
}

Jag satte Content-Type-huvudet till application/json i mina serverpostförfrågningar, så jag tror inte att det finns några problem med mina huvuden.

Gör jag något fel? Hur kan jag förhindra att FCM konverterar mina nästlade objekt?

Svar #1

👋 react-native-firebase-författare här,

Vi konverterar inte internt något till strängar i vår implementation, dessa kommer redan som strängar till native, till exempel på Android använder detta RemoteMessage FCM-klassen - där vi anropar getData() som, som du kan se här, endast returnerar strängar.

Sättet jag har löst detta själv om jag vill ha nästlad data är att ha ett enda datafält där jag tillhandahåller all min data som en enda JSON-sträng, sedan när jag tar emot det behöver jag bara JSON.parse ett enda fält för att få tillbaka strukturen. T.ex.

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

Alternativt kan du platta ut ditt dataobjekt innan du skickar det med något liknande detta och sedan platta till det på mottagarsidan med något liknande detta.

Hoppas det här hjälper.

Svar #2

Om du tittar på dokumentationen för meddelandetypen i REST-API:et kommer du att se att data deklareras som:

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

Så data-fältet kan bara innehålla strängvärden, inte mer komplexa objekt.

Om du vill lagra mer komplexa värden, koda dem som en sträng först och dekoda dem sedan på klienten, till exempel med JSON.stringify() och JSON.parse().

Relaterade artiklar