nodejs web服务器和同步文件追加

时间:2015-08-16 22:14:52

标签: node.js fs event-loop

我读过有关nodejs事件循环的内容,但我不太了解的是:

  
      
  • 我创建了一个简单的http服务器,将整个请求后期数据记录到文件中。
  •   
  • 我使用apache-ab以700 kb文件填充它 - 每次请求它。
  •   

我想象每个请求会在事件循环中每次勾选后写一些块,但我发现完整的帖子数据在每次请求后完全写入,我不知道为什么,我无法理解。

我正在使用这样的东西

stream = require('fs').createWriteStream('path/to/log.file', {flags: 'a'})
log = function(data){
   return stream.write(data)
}

require('http').createServer(function(req, res)
{

   // or req.pipe(stream)
   req.on('data', function(chunk){
     log(chunk.toString() + "\r\n")
   })

   req.on('end', function(){
      res.end("ok")
   })

}).listen(8000)
抱歉我的英语不好:)

2 个答案:

答案 0 :(得分:1)

我编辑了代码以输出块大小,并且还使用了一个易于识别的单词' SQUIRREL'在日志文件中搜索。我还使用curl而不是apache ab发送了图像文件,主要是因为我没有设置它。

如果你在运行它的终端中查看http的输出,你会看到处理的每个块的块大小,在我的例子中是65536(你在评论中提到我们应该看到)。在文本搜索中,我为每个处理的块看到了一次SQUIRREL这个词。

您的代码没有任何问题,希望通过这些更改可以让您了解您希望看到的内容。

stream = require('fs').createWriteStream('./logfile.txt', {flags: 'a'});
log = function(data){
   return stream.write(data);
};

require('http').createServer(function(req, res)
{

   // or req.pipe(stream)
   req.on('data', function(chunk){
     log(chunk.toString() + "SQUIRREL ");
     console.log(chunk.length);
   })

   req.on('end', function(){
      res.end("ok");
   })

}).listen(8000)

curl --data-binary" @ IMAG0152.jpg" http://localhost:8000

答案 1 :(得分:1)

  感谢大家的帮助,我找到了主要问题    stream.write返回错误我已添加以下代码,以便drain.pause()使用.resume()事件   问题解决了

ok = stream.write(chunk)

if ( ! ok )
{
    req.pause()
    stream.once('drain', function(){
        req.resume()
        stream.write(chunk)
    })
}