2

我需要编写聊天日志,并且出于各种原因想将数据保存为 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 的幼稚,我深表歉意。

4

2 回答 2

2

编辑:我意识到这并不能完全回答这个问题,但是因为你说你是 NodeJS 的新手,所以我想你可能不知道这种事情是一种选择。所以我把这个作为一个答案,作为完成你想要完成的事情的更好方法。

为什么不通过MongooseJS使用MongoDB。这可能是这些事情的一百万倍:

  1. 快速地
  2. 简单的
  3. 可扩展
  4. 更好的

我肯定会建议这样做。当您使用它时,您不妨使用整个MEAN 堆栈

于 2013-07-09T19:17:21.843 回答
2

我认为您正在寻找类似bunyan的东西。它可以让你做这样的事情(来自文档):

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

另一种选择是只编写由行分隔的常规文本日志,而不是编写 JSON。通过这种方式,您可以使用常规的 unix-y 文本处理工具轻松查看或分析日志。

于 2013-07-09T20:22:48.543 回答