2016-05-02 5 views
1

複数のテキストファイルを結合しようとしていますが、それらをzipアーカイバを使用して単一のzipファイルに変換しようとしています。送信後の要約セットのヘッダnode.js

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を見つけることができなかったがそれは彼らの後にヘッダーを設定することはできませんと言います私は問題がconvertTextFilesToZip関数にあると思うけど、私はエラーを生成している正確な場所を特定することはできません。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) 
+1

コードをもっとクリーンにし、エラーを処理しやすくするために、一連の非同期操作の約束事を使用する教科書があったとしても、これは素晴らしい例です。 – jfriend00

+0

'convertTextFilesToZip()'変数 'zipArchive'はどこから来たのですか? – jfriend00

+0

コードで初期化されていますが、ここではコピーされていません – soldiershin

答えて

0

解決策につながったように思われるので、私のコメントを回答にしてください。

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

また、私はあなたのメソッドが非同期にzipArchiveに呼び出し、それはあなたが完了通知の任意の並べ替えを持って前にコールバックが呼び出されているので、あなたがそのためにコーディングされているようには見えません期待されます。

関連する問題