2014-02-20 78 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

可以有,而且往往是,超過'data'以可讀流的單個chunk。您需要確保擁有所有這些(即使只有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將是Object秒的Array。因此,您必須訪問它的索引才能檢索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

明白了。另一個答案基本上只建立在你的觀點上。 –