2016-12-15 35 views
0

好吧,我有以下代碼res.end一系列嵌套的回調內部

router.route('/getParkData/:parkLocationId').get(function(req, res){ 
    var id = req.params.parkLocationId; 
    var parkdata = {}; 
    parkInfo(id).then(function(data){ 
    if(data.parking_type == 'FREE') 
    { 


    var json = JSON.stringify({ 
     "error" : null, 
     "result" : null, 
     "message" : "free", 
     "error_code" : null 
    }); 
     res.end(json); 
    } 
    else 
    return getTwowheelers(id) 
    }).then(function(data){ 
    if(data[0].parking_type) 
     { 
     parkdata.parkingType = data[0].parking_type; 
     } 
     else 
     { 
     parkdata.parkingType = "paid"; 
     } 

    if(data.length > 0) 
     { 
     parkdata.tw = data[0].rate.tw[0]; 
     } 
     else 
     { 
      parkdata.tw= 0; 
     } 
     return getFourwheelers(id); 
    }).then(function(data){ 
    console.log(data.length); 
     if(data.length > 0) 
       { 
        parkdata.fw = data[0].rate.fw[0]; 
       } 
       else 
       { 
          parkdata.fw = 0; 
       } 
      res.json(mResponse.response(null, parkdata, "Success",200)); 
    }).catch(function(err){ 
     res.json(mResponse.response(null, null, "No data!",500)); 
    }); 

}); 

所以我在做通過檢查條件和結束respons.Its做工精細速戰速決,但我得到這個錯誤。

Unhandled rejection Error: Can't set headers after they are sent. 
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
at ServerResponse.header (C:\zoyoapp\node_modules\express\lib\response.js:719:10) 

所以res.end沒有結束execution.Any方式,我可以讓它不顯示這個錯誤

+0

請妥善縮進代碼。 – str

+0

你的代碼似乎沒有適當的匹配花括號不完整的,你可以發佈完整的代碼 – Sridhar

+0

@Sridhar嘿,我也做了編輯您想要res.end後'跳過承諾鏈執行其餘 –

回答

2

Error: Can't set headers after they are sent.是因爲你在許鏈的末端再次發送響應。您可以通過拒絕承諾鏈來儘早打破承諾鏈。

router.route('/getParkData/:parkLocationId').get(function(req, res) { 
    var id = req.params.parkLocationId; 
    var parkdata = {}; 
    parkInfo(id).then(function(data) { 
     if (data.parking_type == 'FREE') { 
      return Promise.reject({ 
       type:'FREE_USER' 
       data: JSON.stringify({ 
       "error": null, 
       "result": null, 
       "message": "free", 
       "error_code": null 
       }) 
      }); //rejecting this promise 
     } else { 
      return getTwowheelers(id); 
     } 
    }).then(function(data) { 
     if (data[0].parking_type) { 
      parkdata.parkingType = data[0].parking_type; 
     } else { 
      parkdata.parkingType = "paid"; 
     } 

     if (data.length > 0) { 
      parkdata.tw = data[0].rate.tw[0]; 
     } else { 
      parkdata.tw = 0; 
     } 
     return getFourwheelers(id); 
    }).then(function(data) { 
     console.log(data.length); 
     if (data.length > 0) { 
      parkdata.fw = data[0].rate.fw[0]; 
     } else { 
      parkdata.fw = 0; 
     } 
     res.json(mResponse.response(null, parkdata, "Success", 200)); 
    }).catch(function(err) { 
     if(err.type === 'FREE_USER'){ 
      return res.send(err.data); // sending response only once 
     } 
     res.json(mResponse.response(null, null, "No data!", 500)); 
    }); 
+0

哇那是一個真正的好辦法做到這一點,所以我們可以在任何地方拒絕的希望,但是我因此未得到你們是怎麼使用的承諾,而無需創建它,我的意思是返回新Promise.reject({ 類型:'FREE_USER 「我這是怎麼知道的承諾,有點迷茫。 –

+0

是的,你可以使用'Promise'像'Promise.resolve()靜態方法','Promise.reject()'。這是[Mozilla開發文檔( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#Using_the_static_Promise.resolve_method) – Sridhar

0

當條件

if(data.parking_type == 'FREE') 

是真的,那將回復json

var json = JSON.stringify({ 
    "error" : null, 
    "result" : null, 
    "message" : "free", 
    "error_code" : null 
}); 
res.end(json); 

但是代碼會在下一次和下一次中繼續執行,然後最後它會找到c ommand

res.json(mResponse.response(null, parkdata, "Success",200)); 

其中嘗試設置這會導致錯誤的報頭。即你嘗試在res.end();之後發送響應。