2017-02-28 3 views
0

Sobald fs.readFile Schleife durch alle Dateien und erhalten Sie die passenden Daten und drücken Sie es auf Ergebnisse, möchte ich callback(results) aufrufen, damit ich Antwort an den Client senden kann. Ich erhalte einen Fehler mit unter dem Code Error: Callback is already called HOw kann ich dieses Problem mit async Ansatz lösen.Callback wird bereits mit Async aufgerufen?

app.js

searchFileService.readFile(searchTxt, logFiles, function(lines, err) { 
    console.log('Logs', lines); 
    if (err) 
     return res.send(); 
    res.json(lines); 
}) 

readFile.js

var searchStr; 
var results = []; 

function readFile(str,logFiles,callback){ 
    searchStr = str; 
    async.map(logFiles, function(logfile, callback) { 
      fs.readFile('logs/dit/' + logfile.filename, 'utf8', function(err, data) { 
       if (err) { 
        callback(null,err); 
       } 
       var lines = data.split('\n'); // get the lines 
       lines.forEach(function(line) { // for each line in lines 
        if (line.indexOf(searchStr) != -1) { // if the line contain the searchSt 
         results.push(line); 
         callback(results,null); 
        } 
       }); 
      }); 
    }), function(error, result) { 
     results.map(result,function (result){ 
      console.log(result); 
     }); 
    }; 
} 
+0

versuchen, params umzukehren: Callback (Ergebnisse, null); in ok Ergebnis –

+0

in app.js Ich habe versucht, ersten Fehler wie 'Funktion (err, Linien)' – hussain

+0

Ja, aber wenn geht ok, Params ist umgekehrt –

Antwort

2

Hinweis: diese Antwort ist eine Erweiterung trincot's answer. Also, wenn dies Ihre Frage beantwortet, markieren Sie bitte seine Antwort!

Sie sagte: Sobald fs.readFile Schleife durch alle Dateien und die passenden Daten erhalten und es zu den Ergebnissen schieben dann glaube ich nicht .map die entsprechende Funktion dafür ist, um ehrlich zu sein. Dies ist zum Transformieren jedes Elements von einem Array in ein anderes, was nicht das ist, was Sie tun.

Eine bessere Methode wäre .eachSeries, um jeweils eine Datei zu lesen.

Es ist eine gute Idee, Ihre zweite callback in etwas anderes, z. done um sich (und andere) nicht zu verwirren. Rufen Sie done() an, um zu erfahren, dass die Operation für die Datei abgeschlossen ist, da wir die Datei "fertig" gelesen haben.

Schließlich, seien Sie vorsichtig mit Ihren Tippfehlern. Der erste hat dich vielleicht daran gehindert, in den letzten Teil zu kommen.

var results = []; 
var searchStr; 

function readFile(str, logFiles, callback) { 
    searchStr = str; 
    // loop through each file 
    async.eachSeries(logFiles, function (logfile, done) { 
     // read file 
     fs.readFile('logs/dit/' + logfile.filename, 'utf8', function (err, data) { 
      if (err) { 
       return done(err); 
      } 
      var lines = data.split('\n'); // get the lines 
      lines.forEach(function(line) { // for each line in lines 
       if (line.indexOf(searchStr) != -1) { // if the line contain the searchSt 
        results.push(line); 
       } 
      }); 
      // when you are done reading the file 
      done(); 
     }); 

    // wrong: }), function (err) { 
    }, function (err) { 
     if (err) { 
      console.log('error', err); 
     } 
     console.log('all done: ', results); 

     // wrong: results.map(result, function (result){ 
     results.map(function (result){ 
      console.log(result); 
     }); 

     // send back results 
     callback(results); 
    }); 
} 
+0

mit Ihrem Ansatz habe ich die 'Ergebnisse' auf Client-Seite, gibt es ein Problem Nehmen wir an, wenn Benutzer 'id0536' sucht, wenn eine Zeile diese ID enthält, wird das Ergebnis das erste Mal gerendert, zwei Probleme # 1, wenn ich dieselbe Zeichenfolge zweimal suche, dieselbe Zeile verschiebe und als zwei Zeilen # 2 sende, wenn ich mit anderen suche String-Wert sendet Ergebnisse der ersten Suche. – hussain

+0

@Mikey, gut entdeckt, hat die doppelte 'Callback'-Variable mich in meiner Antwort verwirrt, die ich löschen werde (+1). – trincot

+0

@hussain, da Ihre Frage eindeutig beantwortet wurde, stellen Sie bitte alle weiteren Fragen als neue Fragen. – trincot

Verwandte Themen