2016-04-13 72 views
0

注:我不相信這個問題is a duplicate of this similar question,因爲它更具體。將來自MongoDB遊標的對象流到nodejs HTTP響應

我試圖用nodejs-mongodb-driver從Mongo中檢索多個對象,並將對象作爲JSON寫入HTTP響應。這些對象應該是一個數組的形式,但我不想在光標上調用toArray(),因爲這會佔用內存,我儘可能避免調用大的JSON.stringify調用。

var response = ... // an http response 
collection.find().stream(JSON.stringify).pipe(response); // causes a malformed JSON string 

瀏覽器中的對象如下所示。

{"obj", "obj"}{"obj", "obj"} // clearly malformed 

有沒有一種有效的方法來做到這一點?

回答

1

我將解釋您編寫的代碼,以便了解爲什麼它會返回格式錯誤的JSON,以及爲什麼您可能需要toArray()或您發佈的答案中的JSONStream庫。

第一個collection.find()返回Cursor對象。那時沒有數據被讀取。然後,.stream(JSON.stringify)調用返回一個可讀的Stream與轉換函數JSON.stringify。仍然沒有數據讀取。

.pipe(response)調用然後讀取整個Stream到最後,併爲每個對象調用JSON.stringify函數。請注意,它確實會爲每個單獨的object單獨調用它,因此不會創建array。相反,您會在object之後得到畸形的 JSON,object

現在您發佈的問題中的答案儘可能重複(Stream from a mongodb cursor to Express response in node.js)適用於您,但它需要一個附加的庫文件和JSONStream。 JSONStream正確處理CursorStreamJSON輸出。我不知道這是否真的減少了開銷,但你可以嘗試。

沒有額外的庫文件,您將不得不使用toArray()

+0

我知道爲什麼它的格式不正確。我正在尋求一種有效的方式來做到這一點。如果有一個額外的圖書館,你爲什麼不建議一個。 – MatUtter

+0

您已在該問題的第一行中發佈了該答案。而且我仍然認爲陣列效率很高。你做過測試嗎?圖書館是在你認爲不是重複的問題的答案。 – x4rf41