2016-04-21 13 views
0

サーバー上のイベントエミッタへのリクエストが到着したときにわかるように、そのリクエストは決して閉じず、メッセージを送信するたびにres.write()する必要があります。しかし、このリクエストを実行したクライアントが去ったときに通知される方法はありますか? requestオブジェクトにプロパティはありますか?クライアントがサーバー送信イベントから退会したときに通知する方法はありますか?

私は次のルート

app.get('/event',function(req,res){ 

//set response headers 

//how do I check if req object is still active to send a message and perform other actions? 

}) 
+0

なぜ興味があるのですか? – baynezy

+0

私は、ユーザーが購読するたびにインクリメントするカウンタを持っており、購読を停止するたびに減少したいと考えています...それはすべてです –

答えて

0

があるとイベントの基本的な配列は、他のフレームワークに類似していなければならないが、この例では、Grailsの3.3です。

最初にサブスクライブし、接続を閉じるためのエンドポイントを設定します。

def index() { 
    // handler for GET /api/subscribe 

    rx.stream { Observer observer -> 

     // This is the Grails event bus. background tasks, 
     // services and other controllers can post these 
     // events, CLIENT_HANGUP, SEND_MSG, which are 
     // just string constants. 

     eventBus.subscribe(CLIENT_HANGUP) {String msg -> 

      // Code to handle when the grails event bus 
      // posts CLIENT_HANGUP 
      // Do any side effects here, like update your counter 
      // Close the SSE connection 

      observer.onCompleted() 
      return 
     } 

     eventBus.subscribe(SEND_MSG) {String msg -> 

      // Send a Server Sent Event 

      observer.onNext(rx.respond(msg)) 
     } 
    } 
} 



def disconnecting() 
{ 
    // handler for GET /api/disconnect 
    // Post the CLIENT_HANGUP event to the Grails event bus 

    notify(CLIENT_HANGUP, 'disconnect') 
} 

は今、クライアントに、あなたはあなたのユースケースは、それを必要とするたびにGET /api/disconnectに配置する必要があります。誰かがあなたのページから移動したときに気付きたいと思えば、window.onbeforeunloadに関数を登録することができます。この例では、Vue.jsAxiosを使用しています。サーブレットの場合

window.onbeforeunload = function (e) { 
    e.preventDefault() 
    Vue.$http({ 
     method: 'get', 
     url: 'http://localhost:8080/api/disconnect' 
    }) 
     .then((response) => { console.log(response) }) 
     .catch(({error}) => { console.log(error) }) 
    } 

は、Grailsのようにスタック、私はブラウザが去って行ったときに私が行うには、私自身のないハウスキーピングがなかった場合でも、これを行うために必要なことがわかりました。それがなければ、ページリロードはバックエンドでIOExceptionを引き起こしていました。

関連する問題