【问题标题】:Read/write in a file asynchronically on a webserver在网络服务器上异步读取/写入文件
【发布时间】:2016-10-29 05:39:21
【问题描述】:

我有一个快速服务器正在运行。 post 路由之一执行 http 请求,每个请求我都想将数据记录到文件中。我将记录的数据是从正在发送的数据中提取的。

我发送的数据是 xml 格式的,所以我先用 xml2js 模块解析它。 之后,我读取了该文件,以便可以附加我的新 JSON,然后将结果写回我的文件中。我正在使用 jsonfile 模块读取和写入我的 json 文件。

我目前担心的是同时有 2 个请求。

我的读/写将是异步的,我会丢失数据。我相信随着文件开始增长并且功能需要更多时间来完成,问题会更加明显。

那么我该如何处理呢? 我绝对反对使用readfilesyncwritefilesync

 ...
  app.post('/testapi', function (req, res) {

   request({
       "url": 'https://webservice.com',
       "method": "POST",
       "body" :req.body
     },
       function(err, response, body){
        if (err) {
            res.send(err);
        } else {
            res.send(body);
            logSomeData(req.body);
        }
    });
});

function logSomeData(body) {
    var currYear = new Date().getFullYear(),
            currMonth = new Date().getMonth(),
            fileName = __dirname + '/logs/' + currYear + '_' + currMonth + '.json';

    parseString(body, function (err, result) {
        jsonfile.readFile(fileName, function(err, obj) {

            var logData = {test : "test"};
            obj.push(logData);

            jsonfile.writeFile(fileName, obj, {spaces: 2}, function(err) {
                console.error(err)
            });
        });
    });
}

【问题讨论】:

  • 这就是人们使用数据库而不是 JSON 文件的原因。他们为您处理文件锁定的所有问题。
  • @Quentin 我的公司使用 Oracle DB。 Oracle 确实有它的 nodejs 驱动程序,但安装仍然很笨重,而且驱动程序相当新鲜。是否有其他轻型数据库可以用于此目的,是否值得?
  • SQLite 浮现在脑海中。是的。是的。
  • @Quentin 这样的记录器在这种情况下有用吗?记录器能解决读/写异步问题吗?

标签: javascript node.js express request fs


【解决方案1】:

这听起来像是数据库的工作,因为数据库引擎通常更擅长处理多个连接 - 即根据需要“即时”添加记录。

然后,如果您愿意,您可以稍后将信息提取到文本文件中...或者只是将 SQL 查询应用于数据库以获取您真正需要的信息。

确定使用哪种数据库可能超出了这个问题的范围,取决于您的需求和资源。

【讨论】:

    【解决方案2】:

    您可以使用某种将内容记录到文件中的中间件,但 nodejs 在读取和解析大型 XML 文件时可能会出现一些性能问题,在我的公司中,我们正在解析大型 XML 文件(150-140MB),用于单节点应用程序将导致服务器完全冻结,您将无法向同一服务发出任何其他请求。

    如果您计划使用大量 xml 解析,我的建议是制作一些其他 Node\JAVA 服务来进行日志记录\解析,这样您就可以让您的主节点服务器可用于其他请求。

    另外,我建议使用某种 XML Streaming 库来解析您的 XML 文件(尤其是大文件),因此它会在流中解析它们,而不是将它们全部加载到内存中。

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多