一旦我有来自客户端的参数我希望匹配文件系统中的字符串并将匹配数据发送回客户端,以便熟悉回调,所以在下面的代码中,当我调用回调时,它会向我发送具有正确数据的响应但是在我粘贴代码后,它就抛出错误了。
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 :(得分:0)
这是因为多次调用searchFileService.readFile
的回调。 fs.readFile
在循环中被调用,并且对于循环的每个步骤,您都有新的回调调用。然后res.json(lines);
也多次调用,这就是错误的原因。
您应该使用async之类的内容来执行多个异步fs.readFile
并将其结果收集到一个回调调用中。