2014-04-20 4 views
0

내가 6 개 XML 파일을 읽고 특정 검색 항목에 대한 외모와 사용자에게 반환하는 Node.js를 기능이 다시 전화 해주기는 .. 그래서

... 
var xmlresult = '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xml:lang="en_EN" version="2.0"><channel>'; 
    for (var i = 1; i <= 6; i++) { 
     filename = i + '.xml'; 
     fs.readFile(filename, 'utf8', function(err, data) { 
      if (err) { 
       return console.log(err); 
      } 
      var doc = libxml.parseXmlString(data); 
      var xpath = "/rss/channel/item[contains(translate(description, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'"+ userquery + "')]"; 
      console.log(xpath); 
      var result = doc.find(xpath); 
      console.log(result); 
      result.forEach(function(item) { 
       xmlresult += item; 
       // console.log(item.text()); 
      }); 
     }); 
    } 
    xmlresult += "</channel></rss>"; 
    // console.log(result[0].text()); 
    respond(xmlresult); 

    function respond(data) { 
     // response.set('Content-Type','text/xml').send(data); 
     response.write(data); 
     response.end(); 
    } 
... 

문제를 루프에서 XML 파싱 만들기 XML 파싱이 발생하기 전에도 응답이 발생한다는 것입니다. 나는 노드가 비동기 적이기 때문에 그것을 안다. 지금은 루프

if(i==6){ 
xmlresult += "</channel></rss>"; 

respond(xmlresult); 
} 

그것은 아직도 내가 FS 때문에 추측 문제를 해결 실 거예요 위해에 문을 추가하여 문제를 해결하기 위해 노력하고 비동기가는 libxmljs합니다. 나는 그것을 시도했다. 그래서 내가 무엇을해야하니?

답변

0

Nevermind. 해결 사용 async.eachSeries

var xmlresult = '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xml:lang="en_EN" version="2.0"><channel>'; 
var filenames = [ '1.xml', '2.xml', '3.xml', '4.xml', '5.xml', '6.xml' ]; 
i = 0; 
// filenames.forEach(function(filenames){ 
async.eachSeries(filenames, processfile, respond); 

// }); 
function processfile(filename,callback) { 
    fs 
      .readFile(
        filename, 
        'utf8', 
        function(err, data) { 
         if (err) { 
          return console.log(err); 
         } 
         var doc = libxml.parseXmlString(data); 
         var xpath = "/rss/channel/item[contains(translate(concat(title,description), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'" 
           + userquery + "')]"; 
         console.log(xpath); 
         var result = doc.find(xpath); 
         console.log(result); 
         result.forEach(function(item) { 
          xmlresult += item; 
          // console.log(item.text()); 
         }); 
         callback(); 
        }); 

} 

function respond(err) { 
    if(err!=null){ 
     console.log(err); 
    } 
    xmlresult += "</channel></rss>"; 
    console.log("sending back"); 
    //respond(xmlresult); 
    // response.set('Content-Type','text/xml').send(data); 
    response.write(xmlresult); 
    response.end(); 
} 

}

관련 문제