2016-02-04 22 views
13

Gdy oczekujące żądanie HTTP zostanie anulowane przez klienta/przeglądarkę, wydaje się, że węzeł z Expressem kontynuuje przetwarzanie żądania. W przypadku intensywnych żądań procesor wciąż jest zajęty niepotrzebnymi żądaniami.Obsługa anulowanych żądań za pomocą Express/Node.js i Angular

Czy można poprosić Node.js/Express o zabicie/zatrzymanie oczekujących żądań, które mają zostać anulowane?

Staje się szczególnie przydatna ponieważ od angularjs żądanie HTTP 1.5 są łatwo cancellable wywołując $cancelRequest() na $http/$resource obiektów.

Takie anulowanie może wystąpić w przypadku ujawnienia metody interfejsu API dostarczającej wyniki dla pól automatycznego uzupełniania lub wyszukiwania: podczas wpisywania w polu, które ma być autouzupełniania lub wyprzedzania z wyprzedzeniem, poprzednie żądania mogą zostać anulowane.

Globalny server.timeout nie rozwiązuje problemu: 1) jest a priori globalnym ustawieniem dla wszystkich ujawnionych metod API 2) przetwarzanie ciągłe w anulowanym żądaniu nie jest zabijane.

Odpowiedz

9

odlewania req przedmiot jest dostarczany ze słuchaczy .on().

Odsłuchanie zdarzenia close pozwala obsługiwać, gdy klient zamyka połączenie (żądanie anulowane przez Angular lub np. Użytkownik zamknął zakładkę zapytania).

Oto 2 proste przykłady użycia zdarzenia close do zatrzymania przetwarzania żądania.

Przykład 1 i terminy synchroniczny blok

var clientCancelledRequest = 'clientCancelledRequest'; 

function cancellableAPIMethodA(req, res, next) { 
    var cancelRequest = false; 

    req.on('close', function (err){ 
     cancelRequest = true; 
    }); 

    var superLargeArray = [/* ... */]; 

    try { 
     // Long processing loop 
     superLargeArray.forEach(function (item) { 
       if (cancelRequest) { 
        throw {type: clientCancelledRequest}; 
       } 
       /* Work on item */ 
     }); 

     // Job done before client cancelled the request, send result to client 
     res.send(/* results */); 
    } catch (e) { 
     // Re-throw (or call next(e)) on non-cancellation exception 
     if (e.type !== clientCancelledRequest) { 
      throw e; 
     } 
    } 

    // Job done before client cancelled the request, send result to client 
    res.send(/* results */); 
} 

Przykład 2: i terminy asynchroniczny blok z obiecuje (analogicznie do redukuj)

function cancellableAPIMethodA(req, res, next) { 
    var cancelRequest = false; 

    req.on('close', function (err){ 
     cancelRequest = true; 
    }); 

    var superLargeArray = [/* ... */]; 

    var promise = Q.when(); 
    superLargeArray.forEach(function (item) { 
      promise = promise.then(function() { 
       if (cancelRequest) { 
        throw {type: clientCancelledRequest}; 
       } 
       /* Work on item */ 
      }); 
    }); 

    promise.then(function() { 
     // Job done before client cancelled the request, send result to client 
     res.send(/* results */); 
    }) 
    .catch(function(err) { 
     // Re-throw (or call next(err)) on non-cancellation exception 
     if (err.type !== clientCancelledRequest) { 
      throw err; 
     } 
    }) 
    .done(); 
} 
+0

Możesz chcieć nasłuchiwać '' aborted' 'zamiast' "close" '. https://nodejs.org/api/http.html#http_event_aborted – ZachB

0

Można ustawić timeout żądań na serwerze:

var server = app.listen(app.get('port'), function() { 
    debug('Express server listening on port ' + server.address().port); 
}); 
// Set the timeout for a request to 1sec 
server.timeout = 1000; 
+0

Chciałbym anulować wniosek, gdy klient prosi o anulowanie. Przydatne w przypadku zapytań o automatyczne uzupełnianie. – Derek

+0

Dodałem kilka komentarzy w pytaniu na temat tej sytuacji: Globalny server.timeout nie rozwiązuje problemu: 1) jest a priori globalnym ustawieniem dla wszystkich ujawnionych metod API 2) przetwarzanie ciągłe w anulowanym żądaniu nie jest zabijane . – Derek

+0

Dziękuję. Przyjrzę się temu. – gnerkus

4

z wyraźnej można spróbować:

req.connection.on('close',function(){  
    // code to handle connection abort 
    console.log('user cancelled'); 
}); 
Powiązane problemy