programing

Express/Node.js 및 Angular를 사용하여 취소된 요청 처리

megabox 2023. 2. 23. 22:42
반응형

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

반응형