如何使用nodejs中的回调发送响应?

时间:2017-02-27 16:51:21

标签: javascript node.js callback

一旦我有来自客户端的参数我希望匹配文件系统中的字符串并将匹配数据发送回客户端,以便熟悉回调,所以在下面的代码中,当我调用回调时,它会向我发送具有正确数据的响应但是在我粘贴代码后,它就抛出错误了。

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.

1 个答案:

答案 0 :(得分:0)

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

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