【问题标题】:How to receive multiple responses asynchronously using callback in nodejs?如何在nodejs中使用回调异步接收多个响应?
【发布时间】:2017-07-19 16:57:16
【问题描述】:

一旦我从客户端获得参数,我想从文件系统中匹配该字符串并将匹配的数据发送回客户端。我正在尝试熟悉回调,因此在下面的代码中,当我调用回调时,它会向我发送带有正确数据的响应,但它会引发错误 - 请参见下文,粘贴代码之后。

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.');

^

错误:发送后无法设置标头。

【问题讨论】:

标签: javascript node.js callback fs


【解决方案1】:

您的 callback 函数被多次调用,因为它位于 for 循环内。

第一次运行时,它会发送一个响应。

第二次运行会抛出错误(因为响应已经发送)

您需要重构您的代码,使其仅在 fs.readFile 的所有实例都已解决后才发送响应。

问题中提供了该问题的一般解决方案:Callback after all asynchronous forEach callbacks are completed

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2022-01-19
    相关资源
    最近更新 更多