2016-12-15 4 views
0

[OK]を私持って、次のコード 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を終了することにより、簡単な修正をしていたが、私はこのエラーを取得します。条件

if(data.parking_type == 'FREE') 

は、それが持つレスポンス意志真であるとき

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は、私はそれがこのエラー

+0

コードを正しくインデントしてください。 – str

+0

あなたのコードは適切な中括弧が一致していないと不完全なようですが、完全なコードを投稿できますか? – Sridhar

+0

@Sridharちょっと編集しました –

答えて

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を拒否することができますが、私はdidnotを得ることはできませんそれを作成せずに約束を返す私は新しいPromise.reject({ タイプ: 'FREE_USER –

+0

はい、 'Promise.resolve()'、 'Promise.reject()'のように 'Promise'に静的メソッドを使うことができます。[Mozilla developer docs]それについてのhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve#Using_the_static_Promise.resolve_method) – Sridhar

0

を示さない作ることができているexecution.Anyの道を終了していません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()の後にレスポンスを送信しようとしています。

関連する問題