2016-07-19 3 views
2

サーバーからの結果が矛盾しています。時々、右の応答が送信され、時々私は、彼らがNode.jsの、Koa.js、およびマングース送信後にヘッダーを削除できません。

router 
.get('/events/', function* getEvent() { 
    let eventList = []; 
    yield Event.find({}, (error, events) => { 
    if (error) { 
     this.response.body = 'Unable to get events.'; 
     this.status = 404; 
     return; 
    } 

    eventList = events; 
    eventList.sort((first, second) => { 
     // sort implementation 
    }); 

    this.response.body = eventList; 
    this.status = 200; 
    }); 
}); 
+1

これは、通常、res.end()呼び出しが矛盾しているために発生します。そうでない場合は、もう少しコンテキストやコードを提供できますか? – Dreamlines

+0

メソッド全体を表示する編集済みのコードブロック。私は時々エンドコールが一貫していないことに気づいた。場合によってはEvent.find()が実行されないことがあります。 – safaiyeh

+1

これは、エラーをどのように処理するかによって発生する可能性があります(そのコードも追加できますか?)。また、あなたは 'Event.find()'にもコールバックを渡しているので、 'yield 'は余計なようです。 – robertklep

答えて

1

この問題は、歩留まりが完了するのを待たずに競合条件が発生するコールバックによって発生します。 Koa v1.xでは、通常、コールバックAPIを使用して約束を返すだけです。ここで

あなたは興亜v1.xはとあなたの例を記述します。方法は次のとおりです。

router 
    .get('/events', function *() { 
    let events 
    try { 
     events = yield Event.find({}) 
    } catch (err) { 
     this.status = 503 
     this.body = 'Unable to get events' 
     return 
    } 
    events = sort(events) 
    this.body = events // Implicit 200 response 
    }) 

Event.findはちょうど屈曲可能な約束のようなものを返す必要があります。あなたの使用しているライブラリが約束を返すバージョンであるかどうかを確認してください。

通常、あなたはちょうどこのようにそれを書きたいけど:Event.findがダウンしている場合、それは内部エラー(500応答)ですので

router 
    .get('/events', function *() { 
    let events = yield Event.find({}) 
    events = sort(events) 
    this.body = events 
    }) 

。 Koaは、予期しないエラーを500件の回答に変換します。

1
を使用して

に送信された後、エラー

はヘッダを削除することはできません取得され

this.statusを200に設定した後は、this.response.bodyがおそらくundefined.であり、console.log() this.response.bodyと定義されているかどうかを確認するため、エラーが発生します。 undefinedの場合、req.bodyが正しく入力されていないか、または非同期ノードの問題であると推測されます。基本的には、this.response.body = eventListが設定されているので、eventList.sort()は非同期に実行されます。したがって、eventListはソートされていません。これを修正するには、eventList.sort()コールバックの中に入れます。

編集:あなたのコメントを見て、私は今それが非同期の問題であると確信しています。ソートコールの中の最後の2行をあなたのために動かすかどうかを教えてください。

+0

ソート・コールを停止する行を追加しましたが、それでも問題は解決しません。 – safaiyeh

+0

this.responseのconsole.logにあるものを教えてください。body – gcoreb

+0

私はちょうど私に起こった:this.request.body、this.response.body – gcoreb

関連する問題