1

複数のテキストファイルを結合し、zip アーカイバーを使用して単一の 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);


}

初めて問題なく動作し、その後このエラーがスローされます.resが2回返される他の投稿を確認しましたが、見つかりませんでした.送信後にヘッダーを設定できないと書かれています.問題だと思います. convertTextFilesToZip 関数にありますが、エラーを生成している正確な場所を特定できないようです。

  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)
4

1 に答える 1

0

解決につながったように見えるので、私のコメントを回答にします。

変数zipArchiveは初期化されていないconvertTextFilesToZip()ため、ある関数呼び出しから次の関数呼び出しまでその変数を再利用していますが、これは正しい実装ではないようです。

また、メソッド呼び出しが非同期であると予想さzipArchiveれますが、何らかの完了通知を受け取る前にコールバックが呼び出されるため、そのようにコーディングしているようには見えません。

于 2016-05-02T19:19:11.590 に答える