2013-07-09 48 views
1

我需要編寫聊天記錄,並且出於各種原因想將數據保存爲JSON。如何使用帶有Node.js的fs.createWriteStream()將字符串化的JSON數組追加到字符串

在任何時候,我可能會打開很多房間,並且當第一個用戶進入房間時當前打開writeStream,然後在最後一個用戶退出時結束流。

writeStream對象暫時存儲在一個陣列中,以及有關房間和當前在線用戶的其他詳細信息。在任何給定時間都可以使用每個房間對象的情況下,我的理解是,隨着各個房間中的用戶聊天,應該非常快速且高效地連續寫入許多聊天日誌文件。

我對node.js很新,所以請隨時糾正我,並提供一個更有效的方法,上面。

但到我的實際問題。

每次寫入都是一個單獨的javascript對象,其中包含特定的userdata,聊天正文以及發生時間。

我目前正在創建txt文件,並使用JSON.stringify()到每個聊天對象的字符串化版本追加到該文件,因爲它的用武之地。

這當然會產生導致下面的文本表示無效JSON :

{"userid":"1","body":"hello world"}{"userid":"2","body":"hello world 2"}{"userid":"3","body":"hello world 3"} 

當在現實中,它需要讀取:

[{"userid":"1","body":"hello world"},{"userid":"2","body":"hello world 2"},{"userid":"3","body":"hello world 3"}] 

現在的明顯的解決方案是實際打開node.js中的文件,解析JSON,將對象推入數組,然後將所有數據寫回。但是這對於IO和處理方面都非常昂貴。

另一種替代方法是在每個對象的開頭添加一個特殊字符,如|。然後,在讀取日誌文件客戶端時,只需簡單地分割該字符和JSON中的文件內容即可。對結果數組中的每個對象進行分析。但肯定有更好的辦法?

因此,我正在尋找的是一種更有效的方法,可以一次處理多個聊天室的日誌記錄。如果可能,利用writeStreams

理想我真的想簡單地以下列方式將數據寫入:

',' + chatobject + ']'

,然後在接下來的寫操作只需通過除去「]」字符修剪文件的末尾,寫下一個。在txt文件中留下一個經常有效的JSON字符串。

另外,是否有更好的方法,通過實際寫入.json文件本身並避免完全解析。

在此先感謝,對於我對node.js的天真表示歉意。

回答

2

編輯:我意識到這並不完全回答這個問題,但是因爲你說你是NodeJS的新手,我以爲你可能不知道這種事情是一種選擇。所以我把這個作爲一個答案作爲一個更好的方式來完成你想要完成的事情。

爲什麼不使用MongoDBMongooseJS。這可能是一個萬次以上每這些事情的:

  1. 快速
  2. 可擴展
  3. 更好

我肯定會推薦做這種方式。當你在這裏時,你可以使用整個MEAN stack

+0

我認爲文件系統本身更適合這個任務的主要原因很簡單,我絕對不需要查詢任何數據,每個日誌文件與房間的ID共享其名稱。因此,據我所知,使用數據庫,即使是NoSQL,也不會有不必要的開銷?或者,我是否誤解MondoDB?無論如何,我很欣賞答案,並且肯定會深入研究MongoDB。乾杯。 – gordyr

+0

@gordyr我會說,即使你不需要使用MongoDB查詢數據仍然會更容易。學習需要一秒鐘的時間,但這並不難,尤其是像MongooseJS這樣的圖書館。這真的很簡單,如果你想要進一步採用這個應用程序,你會更快樂:) – kentcdodds

+0

進一步研究MongoDB後,我決定你是對的。隨着應用規模的擴大,最大的優勢就是易於分銷。感謝您的正確方向,我會給你答案。如果其他人直接回答這個問題,爲了完整起見,我仍然非常有興趣閱讀它。無論如何,再次感謝:) – gordyr

2

我認爲您正在尋找類似bunyan的東西。它可以讓你做這樣的東西(from the docs):

var bunyan = require('bunyan'); 
var log = bunyan.createLogger({name: "myapp"}); 
log.info("hi"); 

另一種選擇是隻寫一行,而不是寫JSON分離常規文本日誌。這樣您就可以使用常規的unix-y文本處理工具輕鬆查看或分析日誌。

+0

非常感謝。我已經決定如上所述去使用MongoDB路線。但這是非常棒的信息。謝了哥們。 :) – gordyr