一旦fs.readFile
遍历所有文件并获取匹配数据并将其推送到结果,我想调用callback(results)
以便我可以向客户端发送响应。我收到以下代码的错误我如何Error: Callback is already called
使用async
方法解决此问题。
应用程序.js
searchFileService.readFile(searchTxt, logFiles, function(lines, err) {
console.log('Logs', lines);
if (err)
return res.send();
res.json(lines);
})
读取文件.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);
});
};
}
注意:这个答案是特林科特答案的延伸。因此,如果这回答了您的问题,请将其标记为答案!
你说:一旦 fs.readFile 循环遍历所有文件并获取匹配的数据并将其推送到结果中,老实说,我认为.map不是合适的函数。这是用于将数组中的每个元素转换为另一个元素,这不是您正在做的。
更好的方法是.eachSeries 一次读取一个文件。
将您的第二个重命名callback
为其他名称是个好主意,例如done
不要混淆您自己(和其他人)。调用done()
是为了告诉我们对文件的操作已经完成,因为我们已经“完成”了读取文件。
最后,小心你的错别字。第一个可能阻止您进入最后一部分。
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);
});
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句