Javascript 如何在nodejs中使用回调异步接收多个响应?
一旦我从客户端获得了参数,我想匹配文件系统中的字符串,并将匹配的数据发送回客户端。我试图熟悉回调,因此在下面的代码中,当我调用回调时,它会向我发送带有正确数据的响应,但它会抛出一个错误-请参见下面粘贴的代码之后的内容 app.js: service.js:Javascript 如何在nodejs中使用回调异步接收多个响应?,javascript,node.js,callback,fs,Javascript,Node.js,Callback,Fs,一旦我从客户端获得了参数,我想匹配文件系统中的字符串,并将匹配的数据发送回客户端。我试图熟悉回调,因此在下面的代码中,当我调用回调时,它会向我发送带有正确数据的响应,但它会抛出一个错误-请参见下面粘贴的代码之后的内容 app.js: service.js: 函数readFile(str、日志文件、回调){ searchStr=str; for(var i=0;i您的回调函数会被多次调用,因为它位于for循环中 第一次运行时,它将发送响应 第二次运行时,它将抛出错误(因为已发送响应) 您需要重构代
函数readFile(str、日志文件、回调){
searchStr=str;
for(var i=0;i您的回调
函数会被多次调用,因为它位于for
循环中
第一次运行时,它将发送响应
第二次运行时,它将抛出错误(因为已发送响应)
您需要重构代码,以便仅在解析所有fs.readFile
实例后发送响应
问题中给出了该问题的一般解决方案:您的回调
函数会被多次调用,因为它位于for
循环中
第一次运行时,它将发送响应
第二次运行时,它将抛出错误(因为已发送响应)
您需要重构代码,以便仅在解析所有fs.readFile
实例后发送响应
问题中给出了该问题的一般解决方案:“它的抛出错误”-什么错误?!它可能重复抛出此错误:_http\u outgoing.js:344抛出新错误('发送后无法设置头')^错误:发送后无法设置标题。@JaredSmith-不是重复的。可能是重复的@Quentin你比我更正确。但两者的答案相同。“它的抛出错误”-什么错误?!可能是重复的抛出此错误:_http\u outing.js:344抛出新错误(“发送后无法设置标题”。);^Error:发送后无法设置标题。@JaredSmith-不是重复的。可能是重复的@Quentin。你比我更正确。不过,两个答案都一样。
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);
});
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);
}