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

Javascript 如何在node.js中搜索字符串流?,javascript,string,node.js,search,stream,Javascript,String,Node.js,Search,Stream,如何在流中搜索字符串,然后打印它?我的意思是使用createReadStream。我知道如何使用indexOf在readFile中查找字符串,但我发现使用流更有效 更具体地说,我一直在尝试在流中查找字符串,然后打印出包含该字符串的整行。然而,下面的内容不断给我错误 fs.createReadStream(process.argv[2], function (err, data) { data.indexOf ... 目前,我的程序打印出整个流,而不仅仅是包含字符串的行 var ht

如何在流中搜索字符串,然后打印它?我的意思是使用
createReadStream
。我知道如何使用
indexOf
readFile
中查找字符串,但我发现使用流更有效

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

fs.createReadStream(process.argv[2], function (err, data) {
      data.indexOf ...
目前,我的程序打印出整个流,而不仅仅是包含字符串的行

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);

流是缓冲的,因此传递给
数据
事件(您通常会侦听)的缓冲区不会以任何方式拆分为单独的行或在单独的行上进行分隔

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

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();
  });
});

EDIT:readline删除新行,因此
res.write
添加一个返回)

您可以使用它在流中搜索字符串,而无需缓冲

这非常有效!我想知道是否有一种简单的方法可以打印出找到子字符串的每一行?目前,它只能打印出它找到的每个唯一子字符串的第一行。@krikara-hmm它为我匹配每一行;但是,它在一行上输出它们,因为
readline
去掉了换行符,请参阅我的编辑以获得修复。是的,这很奇怪。可能是因为我正在从Windows CMD运行节点。我确实安装了最新的稳定npm和节点。我要用下面的模块试试运气。哦,实际上我发现了问题。如果子字符串位于.txt文件的最后一行,则不会找到res.write子字符串。否则就行了。@krikara我想在这种情况下,文件不会以换行符结尾。