2011-11-22 65 views
2

我正在使用路由來處理一個url。功能按預期啓動。我想要做的是在回調中使用response.write()。我知道這是行不通的,因爲回調不能訪問與調用它的函數相同的變量,但我想知道正確的NODE方法是什麼。NodeJS response.write回調內

route.post('/{type}subject/{method}', function (request,response) { 
var post = ""; 
request.on('data', function (chunk){ 
    post += chunk; 
}); 
request.on('end', function(){ 
    postData = qs.parse(post); 
    response.writeHead(200); 
    switch(request.params['method'].toLowerCase()) 
    { 
     case "registerobserver": 
      if (postData['uri']){ 
       registerObserver (request.params['type'], postData['uri']); 
       response.write(success("registerobserver")); 
      } 
      else 
       response.write(failure("1","uri undefined")); 

      break; 
     case "unregisterobserver": 
      if (postData['uri']){ 
       client.query ('DELETE observers FROM observers INNER JOIN type ON (observers.TypeID = type.TypeID) WHERE observers.uri ="'+postData['uri']+'" AND type.name = "'+request.params['type']+'"', 
       function(err, info) 
       { 
        if(err){ 
         response.write(failure("2", "general database failure"));} 
        else{ 
        if(info.affectedRows != 0) 
         response.write(success("unregisterobserver")); //this code does not trigger a response due to namespace 

        else 
         response.write(failure("1", "uri not an observer"));//this code does not trigger a response 
         console.log("uri not observer"); 
        } 

        console.log("done"); 
       }) 

      } 
      else 
       response.write(failure("1","uri required")); 

      break; 
     default: 

    } 

    response.end(); 
}) 
//response.write("type: "+request.params['type']+"<br/>method="+request.params['method']); 

}); 

function success(method){return "<?xml version=\"1.0\"?>\n<response stat=\"ok\">\n\t<method>"+method+"</method>\n</response>";} 
function failure(code, message){return "<?xml version=\"1.0\"?>\n<response stat=\"fail\">\n\t<err code=\""+code+"\" msg = \""+message+"\" />\n</response>";} 
+0

你的理解是不正確的;一個匿名函數可以使用其父項的變量。問題是響應可能在回調運行之前發送。 (它是異步的) – SLaks

回答

7

基本上會發生什麼是異步query處理函數後會你response.end()函數調用被稱爲。因此,任何寫入都會失敗。

您需要從回調中調用response.end(),而不要在異步代碼路徑中調用response.end()。 IE瀏覽器。 return之後立即撥打client.query()

+0

Doh。你的迴應非常有意義。感謝您查看代碼,我將在進行更改後發佈。愚蠢的事件驅動。 – Andrew

+0

標記爲答案 - 將response.end()移動到每個response.write調用按預期方式執行之後。謝謝你們倆。 – Andrew