2017-02-27 82 views
0

一旦我有从客户端params我想从文件系统匹配该字符串,并发送匹配的数据回客户端,所以试图熟悉回调,所以在下面的代码时,我打电话回叫它发送给我的回应与正确的数据,但其抛出错误之后,我粘贴了代码。如何在nodejs中使用回调发送回复?

app.js

app.get('/serverSearch', function (req, res) { 
    var searchTxt = req.query.searchTxt; 
    dirDirectory.readDirectory(function(logFiles){ 
     // res.json(logFiles); 
     if(logFiles){ 
      searchFileService.readFile(searchTxt,logFiles,function(lines,err){ 
         console.log('Logs',lines); 
          if (err) 
          return res.send(); 
          res.json(lines); 
        }) 

     } 
    }); 

    console.log('Search text', searchTxt); 
}); 

service.js

function readFile(str,logFiles,callback){ 
    searchStr = str; 
    for(var i=0; i<logFiles.length; i++){ 
     if(logFiles[i].filename !== '.gitignore'){ 
      fs.readFile('logs/dit/' + logFiles[i].filename, 'utf8', function (err,data) { 
       if (err) { 
       return console.log(err); 
       } 
       inspectFile(data,callback); 
       callback(result); 
       result = []; 
      }); 
     } 
    } 

} 

function inspectFile(data,callback) { 
    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 
      result.push(line); 
      // then log it 
      return line; 
     } 
    }); 
    cb(callback); 
} 

function cb (callback) { 
    callback(result); 
} 

错误

_http_outgoing.js:344 
    throw new Error('Can\'t set headers after they are sent.'); 
    ^

Error: Can't set headers after they are sent. 
+0

为什么你甚至有这个函数cb(callback){callback(result);} }结果在这里为空。相反,直接你可以把回调(结果)在调用函数 –

+0

是的,我试过这种方法,但我得到同样的错误。无论如何 – hussain

+0

结果在该函数中为空,因此首先返回到先前的方法。 –

回答

0

出现这种情况是因为searchFileService.readFile回调多次调用。 fs.readFile在一个循环中被调用,并且对于循环的每一步,您都有新的回调调用。然后res.json(lines);也叫多次,这是错误的原因。

您应该使用类似async的东西来执行多个异步fs.readFile并将其结果收集到一个回调调用中。

+0

你能否提供一个带有上述代码的'async'的示例 – hussain

+0

@hussain只需查看文档中的[map function的示例](https://caolan.github.io/async/docs.html#map)即可。这正是你要找的。 – Byte