JSON на NodeJS сервере читается, но выдает ошибку

198
08 января 2018, 07:49

Код на стороне клиента (Unity. За кадром вызов метода, старт и Usings)

https://docs.unity3d.com/Manual/JSONSerialization.html уверяет что таким образом получается корректный JSON

[Serializable]
public class MyClass
{
    public int level;
    public float timeElapsed;
    public string playerName;
}
public IEnumerator POST()
{
    MyClass myObject = new MyClass();
    myObject.level = 1;
    myObject.timeElapsed = 47.5f;
    myObject.playerName = "Dr Charles Francis";
    string json = JsonUtility.ToJson(myObject);
    WWWForm form = new WWWForm();
    form.AddField("data", json);
    var www = new WWW("http://127.0.0.1:8080/server.js", form);
    yield return www;
    Debug.Log(www.text);
    www.Dispose();
    yield break;
}

Код на стороне сервера(за кадром код на старт сервера и всякие require)

function accept(req, resp) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
console.log('body: ' + body);
var jsonObj = JSON.parse(body);
console.log(jsonObj.$key);
})
  resp.end('Получили ответ от сервера ' + new Date() + req.url);
}

И соответствующий результат в консоли сервера

body:   data=%7b%22level%22%3a1%2c%22timeElapsed%22%3a47.5%2c%22playerName%22%3a%22Dr+Charles+Francis%22%7d
undefined:1
data=%7b%22level%22%3a1%2c%22timeElapsed%22%3a47.5%2c%22playerName%22%3a%22Dr+Charles+Francis%22%7d
^
SyntaxError: Unexpected token d in JSON at position 0
    at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (C:\Users\dm\nodeServer\serv\server.js:17:24)
    at IncomingMessage.emit (events.js:159:13)
    at endReadableNT (_stream_readable.js:1062:12)
    at process._tickCallback (internal/process/next_tick.js:152:19)

Т.е. по сообщению в консоли видно, что JSON до сервера доходит, он его даже собирает(видны куски того что мы посылали), но когда пытается выполнить JSON.Parse, что то его не устраивает.

Что я делаю не так?

Answer 1

Вы в функцию parse даёте не json строку, а весь закодированный запрос

if (body.data) {
  // handle error
  return;
}
const data = JSON.parse(decodeURIComponent(body.data));
// {"level":1,"timeElapsed":47.5,"playerName":"Dr+Charles+Francis"}

А воообще советую установить body-parser middleware и упростить себе жизнь! https://github.com/expressjs/body-parser#bodyparserjsonoptions

READ ALSO
Распаковка архива в C#

Распаковка архива в C#

Здравствуйте, мне необходимо распаковать архив updatezip в папку с программой

206