2014-02-20 5 views
0

У меня есть следующий код внутри запроса GET в NodeJSNodeJS получить запрос. Не удается получить доступ к JSON элементы

response.on('data', function (chunk) { 
    console.log(chunk); 
    JSON.parse(chunk); 
    console.log("ch"+chunk.product.productId); 
    responseData+=chunk; 
}); 

Первый console.log печатает весь ответ, который является JSON в виде строки:

{"product":[{"defaultProductUrl":"http:\/\/www.zappos.com\/product\/7306789","defaultImageUrl":"http:\/\/www.zappos.com\/images\/z\/2\/1\/3\/2\/5\/4\/2132548-p-DETAILED.jpg","productId":"7306789","productName":"Pro Short","brandId":"1630","brandName":"CW-X"}],"statusCode":"200"} 

Второй однако выдает ошибку:

console.log("ch"+chunk.product.productId); 

TypeError: Cannot read property 'productId' of undefined 
    at IncomingMessage.<anonymous> (c:\Users\Udai\Desktop\Zappos\server.js:78:38) 
    at IncomingMessage.EventEmitter.emit (events.js:95:17) 
    at IncomingMessage.<anonymous> (_stream_readable.js:746:14) 
    at IncomingMessage.EventEmitter.emit (events.js:92:17) 
    at emitReadable_ (_stream_readable.js:408:10) 
    at emitReadable (_stream_readable.js:404:5) 
    at readableAddChunk (_stream_readable.js:165:9) 
    at IncomingMessage.Readable.push (_stream_readable.js:127:10) 
    at HTTPParser.parserOnBody [as onBody] (http.js:141:22) 
    at Socket.socketOnData [as ondata] (http.js:1584:20) 

Любые идеи о том, что происходит?

ответ

1

Там может быть, и часто, более чем один chunk из 'data' в читаемом потоке. Вы захотите убедиться, что у вас есть все (даже если есть только 1) и выполнить обработку, как только она появится в 'end'.

var body = ''; 

response.on('data', function (chunk) { 
    body += chunk.toString(); 
}); 

response.on('end', function() { 
    // ... 
}); 

Кроме того, необходимо сохранить результат JSON.parse(), поскольку он не изменит свой аргумент.

var data = JSON.parse(body); 

Затем из [...] в JSON, data.product будет Array из Object с. Таким образом, вам нужно получить доступ к индексу, чтобы получить productId.

console.log(data.product[0].productId); 
+0

Работал как шарм. –

2

Вам необходимо скопировать все данные, прежде чем вы сможете запустить JSON.parse на нем. То есть, продолжайте аккумулировать куски в responseData += chunk, , затем пробег JSON.parse. В противном случае вы можете запустить JSON.parse на строке, такой как: {"prop":, а затем еще один кусок: "value"}. Ни один из тех, кто действуют в формате JSON:

response.on("end", function() { 
    console.log(JSON.parse(responseData)); 
}); 
+0

Если вы видите первый оператор журнала, он печатает весь json. Это означает, что кусок - это на самом деле все. В любом случае я попробовал ваш метод также в responseData, и у меня такая же проблема –

+0

@UdaiArora см. Другой ответ; по существу 'JSON.parse' ничего не пишет –

+0

Получил это. Другой ответ в основном основывается только на вашей точке. –

Смежные вопросы