2017-06-07 3 views
0

私はクライアント側searchStrからファイル内の行と一致する必要がある複数の検索キーワードを持っているとします。textとファイルの各行をどのように一致させ、その行をresultsにプッシュしますか?以下のコードでは、私はresultsの空の応答を得ています。何が間違って実装されているのでしょうか?nodejsを使用してファイル内の複数のキーワードを検索するにはどうすればよいですか?

search.js

function asyncFiles(filesData) { 
    async.eachSeries(filesData.logFiles, function(logfile, done) { 
     // read file 
     readStream = fs.createReadStream('./logs/' + filesData.searchEnv + '/' + logfile.filename, 'utf8') 
     readStream.pipe(split()) 
      .on('data', function(line) { 
       var searchStr = [{"text":"4588769"},{"text":"request"}] 
       searchStr.forEach(function(text) { 
        if (line.toLowerCase().indexOf(text.toLowerCase()) != -1) 
         var messageDateInfo = line.split('|')[0].replace(/[\[\]']+/g, ''); 
        messageDateInfo = new Date(messageDateInfo).getTime(); 
        searchStartDate = new Date(searchStartDate).getTime(); 
        searchEndDate = new Date(searchEndDate).getTime(); 
        if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { 
         results.push({ 
          filename: logfile.filename, 
          value: line 
         }); 
        } 
       }); 
      }); 
     done(); 
    }, function(err) { 
     if (err) { 
      console.log('error', err); 
     } 
     readStream.on('end', function() { 
      callback(results); 
     }); 
     results = []; 
    }); 
} 
+0

あなたが持っているコードの問題は何ですか? –

+0

私は空のレスポンを得ていますが、結果に ''はためきます。 – hussain

+0

あなたは 'results'で何をしているのかを示していません。ストリームは非同期であるが、 'results'を同期的に使用しようとしているという問題ではないでしょうか?実際の問題とより完全な例で質問を更新してください。 –

答えて

0

は、あなたの質問には明確resultsで起こったものを示していないが、このコードは依存せずresultsの特定の値を返す必要があります:

function asyncFiles(filesData) { async.eachSeries(filesData.logFiles, function(logfile, done) { // read file readStream = fs.createReadStream('./logs/' + filesData.searchEnv + '/' + logfile.filename, 'utf8') readStream.pipe(split()) .on('data', function(line) { var searchStr = [{"text":"4588769"},{"text":"request"}] searchStr.forEach(function(text) { if (line.toLowerCase().indexOf(text.toLowerCase()) != -1) var messageDateInfo = line.split('|')[0].replace(/[\[\]']+/g, ''); messageDateInfo = new Date(messageDateInfo).getTime(); searchStartDate = new Date(searchStartDate).getTime(); searchEndDate = new Date(searchEndDate).getTime(); if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { results.push({ filename: logfile.filename, value: line }); } }); }); done(); }, function(err) { if (err) { console.log('error', err); } readStream.on('end', function() { setTimeout(function(){callback(results);},2000) }); //results = []; }); }

+0

似たようなコードのように見えます – hussain

0

あなたが遅い混在させることができ任意のロジックを持つ関数を実行し、同期JS実行プログラムnsynjsを介して順次実行します。あなたのコードは次のよう変換されます:

function process(textFile,filesData) { 
    var results=[]; 
    for(var i=0; i<filesData.logFiles.length, i++) { 
     var file = filesData.logFiles[i]; 
     var fh = new textFile(); 
     fh.open(file); 
     var line; 
     var searchStr = [{"text":"4588769"},{"text":"request"}] 
     while (typeof(line = fh.readLine(nsynjsCtx).data) != 'undefined') { 
      for(var i=0; i<searchStr.length; i++) 
       if (line.toLowerCase().indexOf(searchStr[i].toLowerCase()) != -1) { 
        var messageDateInfo = line.split('|')[0].replace(new RegExp("[\[\]']+","g"), ''); 
        messageDateInfo = new Date(messageDateInfo).getTime(); 
        searchStartDate = new Date(searchStartDate).getTime(); 
        searchEndDate = new Date(searchEndDate).getTime(); 
        if (messageDateInfo - searchStartDate > 0 && searchEndDate - messageDateInfo > 0) { 
         results.push({ 
          filename: logfile.filename, 
          value: line 
         }); 
        };    
       }; 
     }; 
     fh.close(); 
    }; 
    return results; 
}; 

をそして、あなたはこのようなnsynjsを経由して、それを実行することができます。

var nsynjs = require('nsynjs'); 
var textFile = require('../../wrappers/nodeReadline').textFile; // part of nsynjs package 

function process(...){ 
... 
} 

nsynjs.run(process,{},textFile,filesData,function (results) { 
    console.log('done', results); // results are ready here 
}); 
関連する問題