ExpressJS-처리되지 않은 오류 이벤트 발생


180

다음 명령을 사용하여 expressjs 응용 프로그램을 만들었습니다.

express -e folderName
npm install ejs --save
npm install

와 함께 응용 프로그램을 실행할 때 node app.js다음 오류가 발생합니다.

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
    at errnoException (net.js:884:11)
    at Server._listen2 (net.js:1022:14)
    at listen (net.js:1044:10)
    at Server.listen (net.js:1110:5)
    at Object.<anonymous> (folderName/app.js:33:24)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

고치는 방법?


30
EADDRINUSE는 포트가 이미 사용 중임을 의미합니다. app.js의 웹 서버가 수신하는 포트를 변경하거나 필요하지 않은 경우 해당 포트를 현재 사용중인 모든 포트를 종료하십시오.
go-oleg

닫는 포트가 고정되어 있지 않으면 다음을 시도하십시오> stackoverflow.com/a/52441297/6665568
Natesh bhat

답변:


400

다른 서버를 실행하여 8080과 같은 포트를 사용했습니다.

node app다른 쉘에서 실행했을 수도 있습니다 . 닫고 다시 실행하십시오.

포트 번호를 확인할 수 있습니다. 사용 가능 여부

netstat -tulnp | grep <port no>

또는 lsof 를 사용할 수 있습니다 .

lsof -i :<port no>

4
나는 WebStorm을 사용하여 이것에 부딪쳤다. 동일한 작업 공간에서 두 개의 디버그 세션을 열었습니다. 도!
Nick Curran

53
이러한 일반적인 오류는 실제로 더 나은 오류 메시지가 필요합니다.
Tamlyn

이것은 node-activedirectory를 사용할 때 발생했습니다. 내 baseDN에 하위 도메인이 없습니다. baseDN : 'ldap : // dc = subdomain, dc = domain, dc =
표시

rails server... : | 의 인스턴스를 실행 중입니다.
Sheharyar

1
맥 높은 시에라 : lsof -nP -i4TCP : $ PORT | grep LISTEN
Roee

61

익스프레스 앱을 실행하면 비슷한 오류가 발생합니다. 이 경우에도 똑같이 따라야합니다. 터미널에서 실행 중인지 확인해야합니다. 프로세스를 찾아서 종료하려면 다음 단계를 수행하십시오.

  • PS AUX | 그렙 노드
  • 프로세스 ID를 찾으십시오 (왼쪽에서 두 번째).
  • -9 PRCOCESS_ID 죽이기

또는

단일 명령을 사용하여 실행중인 모든 노드 프로세스를 닫으십시오.

ps aux | awk '/node/{print $2}' | xargs kill -9

5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Daniel

killall -r node(Linux에서)
jt3k

25

인스턴스가 여전히 실행 중일 수 있습니다. 문제가 해결됩니다.

killall node

업데이트 :이 명령은 Linux / Ubuntu 및 Mac에서만 작동합니다.


1
killall -9 node
Pankaj Shinde

16

Linux를 사용하는 경우 Nodejs가 루트로 실행되지 않는 경우에도이 문제가 발생할 수 있습니다.

이것에서 변경 :

nodejs /path/to/script.js

이에:

sudo nodejs /path/to/script.js

방금 나에게 일어 났으며 여기에 다른 제안은 없습니다. 운 좋게도 루트로 실행할 때 스크립트가 다른 날에 작동하고 있음을 기억했습니다. 이것이 누군가를 돕기를 바랍니다!

면책 조항 : 이것은 아마도 프로덕션 환경에 가장 적합한 솔루션은 아닙니다. 루트로 서비스를 시작하면 서버 / 애플리케이션에 보안 허점이 생길 수 있습니다. 제 경우에는 로컬 서비스를위한 솔루션 이었지만 다른 사람들이 원인을 찾아 내기 위해 더 많은 시간을 보내도록 권장하고 있습니다.


1
이 문제를 해결하기 위해 스크립트를 루트로 실행하면 정말 위험합니다. 1024 미만의 포트에 바인딩하지 않는 한 노드를 루트로 실행할 필요가 없습니다. 귀하의 경우에는 포트 80 또는 443에 바인딩하려고한다고 생각합니다. Nginx를 사용하여 해당 포트에서 8000 또는 그와 같은 더 높은 포트의 nodejs로 트래픽을 전달하는 것이 좋습니다.
varikin

1
지적 해 주셔서 감사합니다. 사용중인 특정 스크립트가 해당 포트 중 하나에 대해 호출되지 않았다고 생각합니다. 노드를 http 서버로 사용하고 있지 않습니다. 어쩌면 추가 권한을 요청한 모듈 중 하나였습니까? 오랜 시간 동안 사과를 드려 죄송합니다. 어떤 스크립트 가이 솔루션을 요구했는지조차 확실하지 않습니다. 프로덕션 환경에서 이것을 시도하는 것에 대한 면책 ​​조항을 추가 할 것입니다.
CauselessEffect

12

스크립트를 실행하는 데 사용중인 포트가 이미 사용 중이기 때문입니다. 해당 게시물을 사용하는 다른 모든 노드를 중지해야합니다. 이를 위해 다음을 통해 모든 노드를 확인할 수 있습니다

ps -e

또는 노드 프로세스의 경우에만 사용 ps -ef | grep node ID가있는 모든 노드 프로세스의 목록을 제공합니다

모든 노드 프로세스를 종료하려면

sudo killall -9 node

또는 특정 ID sudo kill -9 id


당신은 내 밤을 구 했어요!
Mujtaba Mahmood

8

포트를 변경하여 버그를 수정했습니다.

app.set('port', process.env.PORT || 3000);<br>

다음으로 변경되었습니다.

app.set('port', process.env.PORT || 8080);<br>

1
이것이 마크가 제공 한 답변에 받아 들여진 답변을 적용하는 것과 어떻게 다릅니 까?
EWit


2

동일한 포트 번호를 사용하려면 kill %터미널 을 입력 하면 현재 백그라운드 프로세스가 종료되고 추가 사용을 위해 포트가 해제됩니다.


2

이것은 파일이 지금 실행 중임을 의미합니다. 아래 코드를 입력하고 다시 시도하십시오.

sudo pkill node

1

다른 터미널 창에 있거나 다른 포트에서 실행중인 경우에도 실행중인 다른 노드 서버를 닫으십시오. 문제를 해결해야합니다.


1

3000에서 수신 대기하는 모든 노드 인스턴스 및 기타 서비스 (익스프레스 스켈레톤 설정에서 사용되는 기본값)를 종료하려고 시도한 경우, 환경이 '포트'를 예기치 않은 것으로 정의하지 않는지 확인해야합니다. 그렇지 않으면 같은 오류가 발생할 수 있습니다. express skeleton의 app.js 파일에서 15 행을 볼 수 있습니다 :

app.set('port', process.env.PORT || 3000);

1

이 문제를 해결하려면 실행중인 서버를 종료하거나 닫으십시오. Eclipse IDE를 사용하는 경우 다음을 수행하십시오.

실행> 디버그

여기에 이미지 설명을 입력하십시오

실행중인 프로세스를 마우스 오른쪽 단추로 클릭하고 종료를 클릭하십시오 .



1

실제로 Ctrl + C 키는 노드 프로세스에서 사용하는 포트를 해제하지 않습니다. 이 오류가 있습니다. 이 문제의 해결은 server.js에서 다음 코드 스 니펫을 사용하고있었습니다.

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

이것은 나를 위해 일했습니다.

NodeJS의 정상 종료에 언급 된 다른 솔루션을 확인할 수도 있습니다.


1

이 오류의 이유

지정한 다른 포트에서 다른 프로세스가 이미 실행 중입니다.

간단하고 빠른 솔루션

Linux OS에서 예를 들어 3000을 포트로 지정했습니다.

  • 터미널을 열고를 실행하십시오 lsof -i :3000. 프로세스가 이미 포트 3000에서 실행중인 경우 콘솔에이 인쇄가 표시됩니다

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    16615 aegon   13u  IPv6 183768      0t0  TCP *:3000 (LISTEN)

  • 출력에서 PID (프로세스 ID)를 복사하십시오.

  • 실행 sudo kill -9 16615(-9 뒤에 PID를 넣어야 함)

  • 서버를 다시 시작하십시오

0

제 경우에는 달리기 vagrant reload도했습니다. 가상 머신에서 Express 앱을 실행하는 노드 프로세스가 없어도 방랑 상자를 다시로드 할 때 까지이 오류가 발생했습니다.



0

필자 next()의 경우이 문제는 expressjs`use '메소드 호출 을 호출하는 것을 잊어 버린 것 입니다.

현재 미들웨어가 요청-응답주기를 종료하지 않으면 next ()를 호출하여 제어를 다음 미들웨어로 전달해야합니다. 그렇지 않으면 요청이 정지 된 상태로 남아 있습니다.

http://expressjs.com/guide/using-middleware.html




0

동일한 프로세스를 여러 번 종료하고 포트 8000에서 실행중인 다른 것을 찾을 수 없으면 포트 8000에서 두 번 실행하려고한다는 것을 깨달았습니다.

전에:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log("We are live on " + port);
});

후:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});

0

나는 같은 문제가 있었고 CTRL + C로 이전에 취소 한 nodejs 프로세스가 여전히 실행 중이라는 것을 알았습니다. Windows 10의 문제는 Ctrl + C가 정상적으로 노드를 죽이지 않는다는 것입니다. 작업 관리자를 열고 프로세스를 수동으로 종료했습니다. GitHub에서 제공되는 솔루션이 효과가 없었습니다.


0

Windows를 사용하는 경우 작업 관리자에서 node.js에 대한 프로세스를 종료 할 수 있습니다.


0

어떤 대답도 나를 위해 일하지 않았습니다.

컴퓨터를 다시 시작했을 때 서버를 가동시킬 수있었습니다.


shutdown now -r

리눅스
sudo shutdown now -r


0

-> 포트 8080에서 실행중인 항목 또는 확인하려는 포트 u를 확인하십시오.

lsof -i @localhost:8080

무언가가 실행중인 경우 u를 닫거나 kill 명령을 사용하여 닫을 수 있습니다.


0

Visual Studio Code에서 터미널을 확인하기 만하면됩니다. 노드 앱을 실행 중이고 다음날 아침 랩톱을 최대 절전 모드로 전환했기 때문에 랩톱을 소프트웨어 개발로 다시 설정했습니다. 나는 다시 명령 nodemon app.js를 실행합니다. 첫 번째 waas는 밤부터 실행되고 두 번째는 최신 명령을 실행하므로 두 명령 프롬프트가 동일한 포트를 수신 하므로이 문제가 발생합니다. 하나의 터미널 또는 모든 터미널을 닫은 다음 node app.js 또는 nodemon app.js를 실행하십시오.


0

듣고있는 포트가 이미 다른 프로세스에서 수신되고 있습니다.

이 오류에 직면했을 때 Windows PowerShell을 사용하여 프로세스를 종료했습니다 (Windows를 사용했기 때문에)

  1. 목록 항목 창을 엽니 다
  2. 유형을 입력 ps하면 프로세스 목록을 얻을 수 있습니다.
  3. 과정이라는 찾을 노드를 하고주의 이드
  4. 입력 Stop-process <Id> 내가 윈도우 사용자를위한 도움이라고 생각

0

오늘 같은 문제가 발생하여 포트가 사용되지 않았습니다. 다음과 같은 접근 방식이 도움이되었습니다.

rm -rf node_modules && npm cache clean && npm install
npm start

0

그것이 맥에 있다면 그것은 x86_64-apple-darwin13.4.0의 IP에 관한 것입니다. 오류를 따르는 경우 x86_64-apple-darwin13.4.0와 관련이 있습니다. 더하다

127.0.0.1 x86_64-apple-darwin13.4.0

/ etc / hosts 파일의 파일. 그런 다음 문제는 사라졌다


-1

포트를 변경하십시오. 현재 포트가 iis 또는 다른 서버에서 사용 중일 수 있습니다.


이것은 4 년 전에 동일하지만 더 나은 대답으로 묻고 대답했습니다.
George
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.