2017-06-07 1 views
0

Lets sagen, ich habe mehrere Suchbegriffe von Client-Seite searchStr, die mit der Zeile in Datei übereinstimmen sollte, wie ich sowohl text mit jeder Zeile in Datei übereinstimmen und drücken Sie diese Zeile auf results. Mit unterem Code bekomme ich leere Antwort von results, Irgendeine Idee, was falsch umgesetzt wird?Wie man mehrere Schlüsselwörter in der Datei mit nodejs sucht?

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

Was ist das Problem mit dem Code, den Sie haben? –

+0

ich erhalte eine leere respone, die nicht zu "ergebnisse" pusht – hussain

+0

Sie sind nicht zeigen, was Sie mit 'results 'tun. Könnte das Problem eher sein, dass Streams asynchron sind, aber Sie versuchen, 'result' synchron zu verwenden? Bitte aktualisieren Sie Ihre Frage mit dem tatsächlichen Problem und einem vollständigeren Beispiel. –

Antwort

0

Ihre Frage zeigt nicht klar, was mit results passiert aber dieser Code sollte bestimmten Wert von results ohne Abhängigkeit zurück:

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

es sieht aus wie ein ähnlicher Code, was hast du geändert, außer Kommentar 'Ergebnisse' – hussain

0

können Sie langsam mischen arbeitet mit beliebiger Logik und führt sie sequentiell über den synchronen JS-Executor nsynjs aus. Ihr Code wird Transformation wie folgt:

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

Und Sie können es über nsynjs wie folgt ausführen:

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 
}); 
Verwandte Themen