在Web服务器

时间:2016-06-27 09:13:08

标签: javascript node.js express request fs

我正在运行一个快速服务器。其中一个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)
            });
        });
    });
}

2 个答案:

答案 0 :(得分:2)

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

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

确定要使用的数据库类型可能超出了此问题的范围,并且将取决于您的需求和资源。

答案 1 :(得分:-2)

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

如果您打算使用大量的xml解析,我建议使用其他Node \ JAVA服务来进行日志记录解析,这样您就可以让主节点服务器可用于其他请求了。 / p>

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