JSON через NodeJS Express Websocket имеет много дополнительных символов - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть сервер nodeJS, настроенный для работы с Express и BodyParser

const express = require('express')
const expressWs = require('express-ws')
const bodyParser = require('body-parser')
app.ws('/ws', websocket)

Когда веб-сокет получает сообщение, я передаю его на

ws.onmessage = e => {
    const {action, payload} = JSON.parse(e.data)
    channel.send(action,payload)
}

Однако, когда оно приходит в приложение черезВ канале много дополнительных символов

"{\"action\":\"guide_data_retreived\",\"payload\":[{\"id\":544,\"json\":\"{\\\"code\\\":\\\"lPvwP4rz\\\",\\\"coverDesign\\\":null,\\\"created\\\":1535018423000,\\\"description\\\":\\\"{\\\\\\\"blocks\\\\\\\":[{\\\\\\\"key\\\\\\\":\\\\\\\"dpcth\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"This is an example of a medical emergency. \\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},

Что делает его неразборчивым.

Есть идеи, откуда это происходит и как это исправить?

1 Ответ

0 голосов
/ 26 февраля 2019

Проблема в том, что у вас есть несколько уровней JSON с закодированной строкой, вложенных в ваши объекты.

\ - это escape-символы.Они указывают, что следующая за ними кавычка не является завершающей кавычкой, а скорее символом в строке.Например, допустим, я хочу иметь объект javascript, который выглядит следующим образом:

// myFile.javascript
{ "x" : "abc" }
const s = JSON.stringify(foo) // s is a string

Тогда s будет включать эти escape-символы, так что кавычки вокруг "x" и "abc" будутинтерпретируется как внутри строки, а не как символ конца строки:

s == "{\"x\":\"abc\"}" // -> true

Так как s является строкой, вы также можете поместить ее в другой объект, например так:

const bar = { "nested" : s }

И если вы приведете это в соответствие, вы получите еще один уровень экранирования, означающий, что s является строкой, а не вложенным объектом JSON внутри объекта:

JSON.stringify(bar) == "{\"nested\":\"{\\"x\\":\\"abc\\"}\"}

Итак, ясно, что в вашем приложении вы передаете строки вместо объектов.Например, внутри вашего payload, json находится вложенный строковый код JSON, а внутри json, description строковый кодированный JSON.

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

Например, если вы создаете полезную нагрузку следующим образом:

func sendMessage(ws, action, id, json) {
  ws.send(action, {id: id, json: json})
}

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

func sendMessage(ws, action, id, json) {
  ws.send(action, {id: id, json: JSON.parse(json)})
}

И так далее, для каждого уровня вложенного объекта.

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