我需要编写聊天日志,并且出于各种原因想将数据保存为 JSON。
在任何给定时间,我可能会打开许多房间,并且当前writeStream
在第一个用户进入房间时打开一个,然后在最后一个用户退出时结束流。
此writeStream
对象与有关房间和当前在线用户的其他详细信息一起临时存储在一个数组中。像这样在任何给定时间都可以使用每个房间对象,据我了解,当各个房间中的用户聊天时,连续写入许多聊天日志文件应该非常快速有效。
我对 node.js 很陌生,所以请随时纠正我并提供比上述更有效的方法。
但是关于我的实际问题。
每次写入都是一个单独的 javascript 对象,其中包含特定的用户数据、聊天内容,当然还有聊天发生的时间。
我目前正在创建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.parse 结果数组中的每个对象。但肯定有更好的方法吗?
因此,我正在寻找一种更有效的方法,可以同时处理许多聊天室的日志记录。writeStreams
尽可能利用。
理想情况下,我真的很想以以下方式简单地写入数据:
',' + chatobject + ']'
然后对于下一个写入操作,只需通过删除“]”字符并写入下一个字符来修剪文件的末尾。在 txt 文件中留下一个持续有效的 JSON 字符串。
或者,是否有更好的方法通过实际写入 .json 文件本身并完全避免解析。
在此先感谢,对于我对 node.js 的幼稚,我深表歉意。