如何在nodejs中使用回调发送回复?
问题描述:
一旦我有从客户端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.
答
出现这种情况是因为searchFileService.readFile
回调多次调用。 fs.readFile
在一个循环中被调用,并且对于循环的每一步,您都有新的回调调用。然后res.json(lines);
也叫多次,这是错误的原因。
您应该使用类似async的东西来执行多个异步fs.readFile
并将其结果收集到一个回调调用中。
为什么你甚至有这个函数cb(callback){callback(result);} }结果在这里为空。相反,直接你可以把回调(结果)在调用函数 –
是的,我试过这种方法,但我得到同样的错误。无论如何 – hussain
结果在该函数中为空,因此首先返回到先前的方法。 –