Express/Node.js 및 Angular를 사용하여 취소된 요청 처리
보류 중인 HTTP 요청이 클라이언트/브라우저에 의해 취소되면 Express를 사용하는 노드가 요청을 계속 처리하는 것으로 보입니다.부하가 높은 요구의 경우 CPU는 불필요한 요구로 계속 비지 상태가 됩니다.
Node.js/Express에 취소를 요청한 보류 중인 요청을 중지/정지하도록 요청할 수 있는 방법이 있습니까?
AngularJS 1.5 HTTP 요구는 콜을 통해 쉽게 취소할 수 있기 때문에 특히 유용합니다.$cancelRequest()
에$http
/$resource
물건들.
이러한 취소는 자동완료 또는 검색 필드에 대한 결과를 제공하는 API 메서드를 노출할 때 발생할 수 있습니다. 자동완료 또는 자동진행 필드에 입력할 경우 이전 요청을 취소할 수 있습니다.
글로벌server.timeout
문제는 해결되지 않습니다. 1) 모든 노출된 API 메서드에 대한 글로벌 설정 2) 취소된 요청에서 진행 중인 처리는 중지되지 않습니다.
주입.req
오브젝트는 리스너와 함께 출하됩니다..on()
.
듣고 있다close
이벤트에서는 클라이언트가 연결을 닫을 때 처리할 수 있습니다(Angular에 의해 요청이 취소되거나 사용자가 쿼리 탭을 닫은 경우 등).
여기에서는, 다음의 2개의 간단한 예를 나타냅니다.close
이벤트: 요청 처리를 중지합니다.
예 1: 취소 가능한 동기 블록
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 */);
}
예 2: 약속이 있는 취소 가능한 비동기 블록(축소에 대한 아날로그)
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();
}
express를 사용하면 다음 작업을 수행할 수 있습니다.
req.connection.on('close',function(){
// code to handle connection abort
console.log('user cancelled');
});
서버의 요구에 타임 아웃을 설정할 수 있습니다.
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;
언급URL : https://stackoverflow.com/questions/35198208/handling-cancelled-request-with-express-node-js-and-angular
'programing' 카테고리의 다른 글
Angular $http로 다운로드 받은 파일 이름을 얻는 방법 (0) | 2023.02.23 |
---|---|
Angular에서 php(워드프레스) 함수를 사용하는 방법JS 부분 파일? (0) | 2023.02.23 |
CORS 오류: 요청 헤더 필드 허가가 비행 전 응답의 Access-Control-Allow-Headers에 의해 허용되지 않습니다. (0) | 2023.02.23 |
Jest를 사용하여 메서드 호출을 감시하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
스프링 부트: 여러 yml 파일 사용 방법 (0) | 2023.02.23 |