发送后无法设置 headers node.js

Cant set headers after they are sent node.js

我正在尝试合并多个文本文件,使用 zip archiver 将它们转换成一个 zip 文件。

   exports.downloadFilesInZip = function(req, res, next) {

var respObj = {};
var file_names = [];
    var projectId = 111;
    var file_ids = 11111;
    console.log(projectId);
    db.getConnection(function (err, connection) {
        if (err) {
            debug(err);
            next(err);
        }
        else {
            var updateQuery = "select data from file_data where file_id IN (?)";
            console.log(updateQuery);
            connection.query(updateQuery,[file_ids], function (err, results) {
                console.log("inside" + updateQuery);

                if (err) {
                    connection.release();
                    console.log("error" + JSON.stringify(err));
                    debug(err);
                    next(err);
                }
                else {
                    async.eachSeries(results,function(item,loopCallBack){
                        var text = "";
                        console.log("hllllllll");
                        console.log(item.data);
                        console.log(JSON.parse(item.data));
                        document_text = JSON.parse(item.data);
                        console.log("dssddssdsdsdsdsd"+document_text);
                        for(var j=0; j < document_text.length ;j++)
                        {
                            text += document_text[j]['text'];
                        }

                        //file_names.push(convertStringToTextFile(text));
                        convertStringToTextFile(text,function(err,file_name){
                            if(err){
                                console.log(err);
                                loopCallBack(err);
                            }
                            else {
                                file_names.push(file_name);
                                loopCallBack();
                            }
                        })

                    },function(err){
                        if(err){
                            console.log(err);
                            next(err);
                        }
                        else {
                            var updateQuery = "select name from project where id in (?)";
                            console.log(updateQuery);
                            connection.query(updateQuery,[projectId], function (err, results) {
                                console.log("inside" + updateQuery);
                                connection.release();
                                if (err) {
                                    console.log("error" + JSON.stringify(err));
                                    debug(err);
                                    next(err);
                                }
                                else {
                                    var fileName_link = JSON.stringify(results[0].name);

                                    console.log("projectname"+fileName_link);
                                    convertTextFilesToZip(file_names,fileName_link, function (err, filename) {
                                        if (err) {
                                            console.log(err);
                                            next(err);
                                        }
                                        else {
                                            console.log("filename link" + filename);
                                            res.json({
                                                status: 0,
                                                file_link: filename
                                            });
                                        }
                                    });
                                }
                            });
                        }

                    });

                }
            });

        }
    });
}

}

convertStringToTextFile = function(text,cb){
var json_filename = 'tmp/file_'+uuid.v4().replace('-','')+'.txt';
fs.writeFile(json_filename, text , function (err) {
    if (err) {
        debug(err);
        cb(err);
    }
    else{
        cb(null,json_filename);
    }
});

};

convertTextFilesToZip = function(textFiles,file_link,cb){
console.log("textfiles"+textFiles);
var filename = 'reports/'+JSON.parse(file_link)+'_extractedText.zip';
var output = fs.createWriteStream(filename);

output.on('close', function() {
    console.log(zipArchive.pointer() + ' total bytes');
    console.log('archiver has been finalized and the output file descriptor has closed.');
});

zipArchive.on('error', function(err) {
    cb(err);
});

zipArchive.pipe(output);

zipArchive.bulk([
    { expand: true, src: textFiles }
]);

zipArchive.finalize();
cb(null,filename);


}

它第一次工作正常,之后它抛出这个 error.I 已经检查了两次返回 res 的其他帖子,但我找不到 it.It 说无法设置 headers 他们 sent.I 认为问题出在 convertTextFilesToZip 函数中,但我似乎无法确定生成 error.ANy 帮助的确切位置。

  Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:350:11)
at ServerResponse.header     (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/response.js:700:10)
at ServerResponse.send (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/response.js:154:12)
at fn (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/response.js:934:10)
at View.exports.renderFile [as engine] (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/jade/lib/index.js:374:12)
at View.render (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/view.js:93:8)
at EventEmitter.app.render (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/application.js:566:10)
at ServerResponse.res.render (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/lib/response.js:938:7)
at /Users/zeeshandar/Desktop/Agreements_info/agreements_info/app.js:207:13
at Layer.handle_error (/Users/zeeshandar/Desktop/Agreements_info/agreements_info/node_modules/express/li b/router/layer.js:58:5)

将我的评论作为答案,因为它似乎已经导致了解决方案。

变量 zipArchive 未在 convertTextFilesToZip() 中初始化,因此您从一个函数调用到下一个函数调用重用该变量,这似乎不太可能是正确的实现。

此外,我希望您对 zipArchive 的方法调用是异步的,并且您似乎没有为此编写代码,因为回调是在您收到任何类型的完成通知之前调用的。