2016-05-05 3 views
2

Я разбираю мой json на end, но я все еще получаю эту ошибку.cors неожиданный конец ввода JSON

'use strict'; 
const http = require('http'); 
const tools = require('./tools.js'); 

const server = http.createServer(function(request, response) { 
    console.log("received " + request.method + " request from " + request.headers.referer) 

    var body = ""; 
    request.on('error', function(err) { 
     console.log(err); 
    }).on('data', function(chunk) { 
     body += chunk; 
    }).on('end', function() { 
     console.log("body " + body); 
     var data = JSON.parse(body); // trying to parse the json 
     handleData(data); 
    }); 

    tools.setHeaders(response); 
    response.write('message for me'); 
    response.end(); 
}); 
server.listen(8569, "192.168.0.14"); 

console.log('Server running at 192.168.0.14 on port ' + 8569); 

Данные, посылаемые от клиента:

var data = JSON.stringify({ 
    operation: "shutdown", 
    timeout: 120 
}); 

я успешно получить JSON, но я не могу разобрать его.

Update:

Я обновил код, чтобы включить код сервера в полном объеме.

Чтобы быть совершенно ясно, используя следующий код:

.... 
}).on('end', function() { 
     console.log("body " + body); 
     var json = JSON.parse(body); // trying to parse the json 
     handleData(json); 
}); 

Я получаю это:

description

Однако это:

.... 
}).on('end', function() { 
    console.log("body " + body); 
    //var json = JSON.parse(body); // trying to parse the json 
    //handleData(json); 
}); 

производит этот

description

+0

'JSON.parse' принимает строку, которая должна быть действительный JSON. Ошибка, которую вы получаете, означает, что то, что вы анализируете, не является допустимым JSON. Когда я использую вашу стробированную переменную 'data' и передаю ее в' JSON.parse', все работает отлично. – nem035

+0

Я пробовал пару вещей. Я обновил свой вопрос – Shaffanhoon

+1

Попробуйте добавить 'console.log (body);' прямо перед вашим вызовом 'JSON.parse', чтобы убедиться, что' body' фактически имеет то, что вы ожидаете от него. – Paulpro

ответ

0

Оказывается, что, как это запрос кросс-происхождения (CORS), он пытался разобрать данные, отправляемые в preflighted запросе.

Я просто должен был добавить if поймать этот

....  
}).on('end', function() { 
    if (request.method !== 'OPTIONS') { 
     var data = JSON.parse(body); 
     handleData(data); 
    } 
}); 

success

Далее чтение, если вы заинтересованы: HTTP access control (CORS)

1

Можем ли мы видеть код сервера, пожалуйста?

Настоящий рабочий пример, который является (более или менее) тем, что вы пытаетесь, я считаю.

"use strict"; 
const http = require('http'); 

/******************** 
    Server Code 
********************/ 
let data = { 
    operation: 'shutdown', 
    timeout: 120 
}; 
const server = http.createServer((req, res) => { 
    res.writeHead(200, { 'Content-Type': 'application/json' }); 
    res.write(JSON.stringify(data)); 
    res.end(); 
}); 
server.listen(8888); 

/******************** 
    Client Code 
********************/ 
let options = { 
    hostname: 'localhost', 
    port: 8888, 
    path: '/', 
    method: 'POST', 
    headers: { 
     'Accept': 'application/json' 
    } 
}; 
let req = http.request(options, res => { 
    let buffer = ''; 
    res.on('data', chunk => { 
     buffer += chunk; 
    }); 
    res.on('end',() => { 
     let obj = JSON.parse(buffer); 
     console.log(obj); 
     // do whatever else with obj 
    }); 
}); 
req.on('error', err => { 
    console.error('Error with request:', err); 
}); 
req.end(); // send the request.