如何在node.js中的流中搜索字符串?

kri*_*ara 2 javascript string search stream node.js

如何搜索流中的字符串然后打印?我的意思是使用createReadStream。我想出如何找到字符串readFile配合使用的indexOf,但我读使用流更有效。

更具体地说,我一直在尝试在流中查找字符串,然后打印出包含该字符串的整行。但是以下内容不断给我错误

fs.createReadStream(process.argv[2], function (err, data) {
      data.indexOf ...
Run Code Online (Sandbox Code Playgroud)

当前,我的程序打印出整个流,而不仅仅是打印包含字符串的行。

var http = require('http'); 
var fs = require('fs');

var server = http.createServer( function(req, res) {

console.log("Request received.");

res.writeHead(200, {"Content-Type": "text/plain"});
res.write("Hello World\n\n\n");

var s = fs.createReadStream(process.argv[2]).pipe(res); 

s.on('end', function(){ res.end() }) 


});
server.listen(8000);
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 5

流是经过缓冲的,因此传递给data事件(通常会监听)的缓冲区不会以任何方式拆分或分隔成单独的行。

您可以使用该readline模块执行逐行搜索:

var fs        = require('fs');
var readline  = require('readline');

var server = http.createServer( function(req, res) {
  console.log("Request received.");

  res.writeHead(200, {"Content-Type": "text/plain"});
  res.write("Hello World\n\n\n");

  readline.createInterface({
    input     : fs.createReadStream(process.argv[2]),
    terminal  : false
  }).on('line', function(line) {
    var idx = line.indexOf(THE_SUBSTRING);
    if (idx !== -1) {
      res.write(line + '\n');
    }
  }).on('close', function() {
    res.end();
  });
});
Run Code Online (Sandbox Code Playgroud)

编辑: readline删除换行符,所以res.write再加一个)


And*_*rov 5

您可以使用此模块在流中搜索字符串而无需缓冲