codememo

node.js가 충돌하지 않도록 하려면 어떻게 해야 합니까? try-catch가 작동하지 않습니다.

tipmemo 2023. 10. 15. 17:24
반응형

node.js가 충돌하지 않도록 하려면 어떻게 해야 합니까? try-catch가 작동하지 않습니다.

내 경험으로 볼 때, php 서버는 로그 또는 서버 끝에 예외를 던지지만, node.js는 단순히 충돌합니다.내 코드를 트라이캐치로 둘러싸는 것도 모든 것이 비동기적으로 이루어지기 때문에 작동하지 않습니다.다른 사람들은 모두 프로덕션 서버에서 무엇을 하는지 알고 싶습니다.

PM2

합니다 합니다.PM2위해서Node.js. PM2는 로드 밸런싱뿐만 아니라 충돌 및 노드 앱 모니터링에도 탁월합니다.PM2는 노드 앱이 충돌할 때마다, 어떤 이유로든 또는 서버가 재시작될 때에도 즉시 노드 앱을 시작합니다.따라서 언젠가 우리의 코드를 관리한 후에도 앱이 충돌하면 PM2는 즉시 다시 시작할 수 있습니다.자세한 내용은 PM2 설치실행

다른 답변들은 http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception 에서 노드 자신의 문서를 읽을 수 있기 때문에 정말 미친 것입니다.

다른 답변을 사용하는 경우 Node Docs:

:uncaughtException될 수 .

이제 앱 자체가 다운되는 것을 방지하는 솔루션으로 돌아갑니다.

그래서 검토 끝에 Node 문서 자체에서 제안하는 것을 생각해 냈습니다.

사용하지않습니다.uncaughtException,사용하다domains와 함께cluster대신.사용하는 경우uncaughtException되지 않은 가 있을 시작합니다.합니다!

클러스터가 있는 도메인

실제로 우리가 하는 일은 오류를 유발한 요청에 대해 오류 응답을 보내는 동시에 다른 사람들이 정상적인 시간에 끝나도록 하고 해당 작업자의 새로운 요청을 듣는 것을 중단하는 것입니다.

이와 같이 도메인 사용은 클러스터 모듈과 함께 수행됩니다. 마스터 프로세스는 작업자가 오류를 발견했을 때 새로운 작업자를 포크할 수 있기 때문입니다.내 말이 무슨 뜻인지 알기 위해서는 아래 코드를 참조하세요.

사용함으로써Domain을 할 수 합니다.Cluster는 더 할 수 더 큰 를 처리할 수 있습니다 , .

var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;

if(cluster.isMaster) 
{
   cluster.fork();
   cluster.fork();

   cluster.on('disconnect', function(worker) 
   {
       console.error('disconnect!');
       cluster.fork();
   });
} 
else 
{
    var domain = require('domain');
    var server = require('http').createServer(function(req, res) 
    {
        var d = domain.create();
        d.on('error', function(er) 
        {
            //something unexpected occurred
            console.error('error', er.stack);
            try 
            {
               //make sure we close down within 30 seconds
               var killtimer = setTimeout(function() 
               {
                   process.exit(1);
               }, 30000);
               // But don't keep the process open just for that!
               killtimer.unref();
               //stop taking new requests.
               server.close();
               //Let the master know we're dead.  This will trigger a
               //'disconnect' in the cluster master, and then it will fork
               //a new worker.
               cluster.worker.disconnect();

               //send an error to the request that triggered the problem
               res.statusCode = 500;
               res.setHeader('content-type', 'text/plain');
               res.end('Oops, there was a problem!\n');
           } 
           catch (er2) 
           {
              //oh well, not much we can do at this point.
              console.error('Error sending 500!', er2.stack);
           }
       });
    //Because req and res were created before this domain existed,
    //we need to explicitly add them.
    d.add(req);
    d.add(res);
    //Now run the handler function in the domain.
    d.run(function() 
    {
        //You'd put your fancy application logic here.
        handleRequest(req, res);
    });
  });
  server.listen(PORT);
} 

.Domain 상각 새이 노드의 됩니다.

이 모듈은 감가 상각 중입니다.교체 API가 확정되면 이 모듈은 완전히 사용되지 않습니다.도메인이 제공하는 기능을 반드시 보유해야 하는 사용자는 당분간 이 기능에 의존할 수 있지만 향후 다른 솔루션으로 마이그레이션해야 할 것으로 예상됩니다.

그러나 새로운 대체품이 도입되지 않을 때까지 클러스터가 포함된 도메인이 노드 설명서에서 제안하는 유일한 좋은 솔루션입니다.

있는 Domain그리고.Cluster읽어주세요

https://nodejs.org/api/domain.html#domain_domain(Stability: 0 - Deprecated)

https://nodejs.org/api/cluster.html

@Stanley Luo 님께서 클러스터와 도메인에 대해 이렇게 멋진 설명을 해주셔서 감사합니다.

클러스터 및 도메인

저는 이 코드를 제 요구사항과 글로벌 선언문 아래에 바로 넣었습니다.

process.on('uncaughtException', function (err) {
  console.error(err);
  console.log("Node NOT Exiting...");
});

저한테 딱 한가지 마음에 안드는 건 제가 물건이 추락하도록 내버려두면 제가 얻을 수 있는 만큼의 정보를 얻지 못한다는 겁니다.

여기에 언급된 바와 같이, 당신은 당신이 발견할 것입니다.error.stack는 줄합니다와 합니다.

process.on('uncaughtException', function (error) {
   console.log(error.stack);
});

해보세요

npm install supervisor
supervisor app.js

아니면 대신 설치할 수도 있습니다.

서버를 재시작하면 서버가 손상될 때 복구할 수 있습니다.

forever코드 내에서 충돌하는 모든 프로세스를 정상적으로 복구하는 데 사용할 수 있습니다.

forever문서에는 종료/오류 처리에 대한 확실한 정보가 프로그래밍 방식으로 제공됩니다.

Try-catch를 사용하면 발견되지 않은 오류를 해결할 수 있지만 일부 복잡한 상황에서는 비동기 기능을 잡는 것과 같은 작업을 제대로 수행하지 못합니다.노드에서 비동기 함수 호출은 잠재적인 앱 충돌 작업을 포함할 수 있습니다.

으로.uncaughtException는 해결책이지만 비효율적인 것으로 인식되며 향후 Node 버전에서는 제거될 가능성이 높으므로 기대하지 마십시오.

이상적인 솔루션은 도메인(http://nodejs.org/api/domain.html )을 사용하는 것입니다.

서버가 다운된 경우에도 앱이 실행되고 있는지 확인하려면 다음 단계를 수행합니다.

  1. 노드 클러스터를 사용하여 코어당 여러 프로세스를 포크합니다.따라서 한 프로세스가 종료되면 다른 프로세스가 자동 부팅됩니다.확인: http://nodejs.org/api/cluster.html

  2. 도메인을 사용하여 try-catch 또는 uncatched 대신 동기화 작업을 캡처합니다.나는 잡히거나 잡히지 않는 것이 나쁜 생각이라고 말하는 것이 아닙니다!

  3. 서비스를 모니터링하기 위해 영원히/supervisor를 사용합니다.

  4. 노드 앱을 실행하기 위해 데몬 추가: http://upstart.ubuntu.com

이것이 도움이 되기를 바랍니다!

pm2 노드 모듈을 시도해 보세요. 그것은 훨씬 일관적이고 훌륭한 설명서를 가지고 있습니다.로드 밸런서가 내장된 Node.js 앱의 프로덕션 프로세스 관리자입니다.이 문제에 대해서는 적발되지 않은 예외를 피하시기 바랍니다.https://github.com/Unitech/pm2

재수정 작업에 탁월한 효과:

server.on('uncaughtException', function (req, res, route, err) {
  log.info('******* Begin Error *******\n%s\n*******\n%s\n******* End Error *******', route, err.stack);
  if (!res.headersSent) {
    return res.send(500, {ok: false});
  }
  res.write('\n');
  res.end();
});

기본적으로 Node.js는 스택 트레이스를 stderr로 인쇄하고 코드 1로 종료하여 이전에 설정된 프로세스를 재정의하여 이러한 예외를 처리합니다.exitCode.

자세히 보다

process.on('uncaughtException', (err, origin) => {
    console.log(err);
});

UncatchedException은 "매우 조잡한 메커니즘"이며(그렇기 때문에) 도메인은 현재 더 이상 사용되지 않습니다.그러나 우리는 여전히 (논리적인) 도메인 주변의 오류를 잡기 위한 몇 가지 메커니즘이 필요합니다.라이브러리:

https://github.com/vacuumlabs/yacol

이 일을 도와줄 수 있습니다.약간의 추가적인 글로 코드 전체에 멋진 도메인 의미론을 가질 수 있습니다!

언급URL : https://stackoverflow.com/questions/5999373/how-do-i-prevent-node-js-from-crashing-try-catch-doesnt-work

반응형