我需要編寫聊天記錄,並且出於各種原因想將數據保存爲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的天真表示歉意。
我認爲文件系統本身更適合這個任務的主要原因很簡單,我絕對不需要查詢任何數據,每個日誌文件與房間的ID共享其名稱。因此,據我所知,使用數據庫,即使是NoSQL,也不會有不必要的開銷?或者,我是否誤解MondoDB?無論如何,我很欣賞答案,並且肯定會深入研究MongoDB。乾杯。 – gordyr
@gordyr我會說,即使你不需要使用MongoDB查詢數據仍然會更容易。學習需要一秒鐘的時間,但這並不難,尤其是像MongooseJS這樣的圖書館。這真的很簡單,如果你想要進一步採用這個應用程序,你會更快樂:) – kentcdodds
進一步研究MongoDB後,我決定你是對的。隨着應用規模的擴大,最大的優勢就是易於分銷。感謝您的正確方向,我會給你答案。如果其他人直接回答這個問題,爲了完整起見,我仍然非常有興趣閱讀它。無論如何,再次感謝:) – gordyr