Node.js 节点使用错误-真正的解决方案?

Node.js 节点使用错误-真正的解决方案?,node.js,port,nodemon,Node.js,Port,Nodemon,我在ubuntu上运行node,不断收到“打开端口时出错:8080…”,即EADDRINUSE错误 我基本上了解问题所在,但当我寻找解决方案时,我基本上会遇到关于终止流程的最佳方式的争论。另一件事是人们说您需要使用ctrl+c而不是ctrl+z,这不是问题,因为我总是使用ctrl+c,即使nodemon重新启动服务器,我也会遇到这个错误 有真正的解决办法吗?每次都要扼杀这一过程既笨拙又丑陋。另外,我一小时要做20次。更糟糕的是,当我终止这个过程时,这有时会杀死我的邮递员 那么,是否有一个真正的解

我在ubuntu上运行node,不断收到“打开端口时出错:8080…”,即EADDRINUSE错误

我基本上了解问题所在,但当我寻找解决方案时,我基本上会遇到关于终止流程的最佳方式的争论。另一件事是人们说您需要使用ctrl+c而不是ctrl+z,这不是问题,因为我总是使用ctrl+c,即使nodemon重新启动服务器,我也会遇到这个错误

有真正的解决办法吗?每次都要扼杀这一过程既笨拙又丑陋。另外,我一小时要做20次。更糟糕的是,当我终止这个过程时,这有时会杀死我的邮递员

那么,是否有一个真正的解决方案。按优先顺序:

  • 有没有办法一开始就避免这种情况发生?为什么node或nodemon不杀死它正在运行的进程

  • 有没有办法(在我的节点服务器中)有问题地告诉它在服务器崩溃/退出之前终止进程

  • 在我的服务器开始侦听端口之前,是否有方法杀死服务器中的现有进程?我不喜欢这个解决方案,但每次都要用锤子敲打端口,这样我才能让它工作

  • 编辑:

    这就是错误:

    error opening port: 8080
    { Error: listen EADDRINUSE :::8080
        at Object._errnoException (util.js:1022:11)
        at _exceptionWithHostPort (util.js:1044:20)
        at Server.setupListenHandle [as _listen2] (net.js:1351:14)
        at listenInCluster (net.js:1392:12)
        at Server.listen (net.js:1476:7)
        at Function.listen (/home/ksjazzguitar/Programming/test/jwt5/server/node_modules/express/lib/application.js:618:24)
        at Object.<anonymous> (/home/ksjazzguitar/Programming/test/jwt5/server/server.js:46:5)
        at Module._compile (module.js:643:30)
        at Object.Module._extensions..js (module.js:654:10)
        at Module.load (module.js:556:32)
        at tryModuleLoad (module.js:499:12)
        at Function.Module._load (module.js:491:3)
        at Function.Module.runMain (module.js:684:10)
        at startup (bootstrap_node.js:187:16)
        at bootstrap_node.js:608:3
      code: 'EADDRINUSE',
      errno: 'EADDRINUSE',
      syscall: 'listen',
      address: '::',
      port: 8080 }
    
    打开端口时出错:8080
    {错误:侦听EADDRINUSE::8080
    对象处的错误异常(util.js:1022:11)
    at_例外WithHostPort(util.js:1044:20)
    在Server.setupListenHandle[as _listen2](net.js:1351:14)
    在listenInCluster(net.js:1392:12)
    在Server.listen(net.js:1476:7)
    在Function.listen(/home/ksjazzguit/Programming/test/jwt5/server/node_modules/express/lib/application.js:618:24)
    在对象上。(/home/ksjazzguit/Programming/test/jwt5/server/server.js:46:5)
    在模块处编译(Module.js:643:30)
    在Object.Module._extensions..js(Module.js:654:10)
    在Module.load(Module.js:556:32)
    在tryModuleLoad时(module.js:499:12)
    在Function.Module.\u加载(Module.js:491:3)
    位于Function.Module.runMain(Module.js:684:10)
    启动时(bootstrap_node.js:187:16)
    在bootstrap_node.js:608:3
    代码:'EADDRINUSE',
    错误号:'EADDRINUSE',
    syscall:'listen',
    地址:':',
    端口:8080}
    
    回答3和2

    3) 你可以用这个来结束这个过程

    # where 8080 is your port
    sudo kill <(sudo lsof | grep 'TCP \*:8080 (LISTEN)' | awk '{print $2}' | sort -u)
    
    #其中8080是您的端口
    
    sudo kill在我的一个节点服务器中,我添加了以下内容:

    const processExitHandler = async (error) => {
      await this.destroy();
      if(error) console.log(error);
      process.exit(error ? 1 : 0);
    };
    
    process.on('exit', processExitHandler);
    process.on('SIGINT', processExitHandler); // Catches ctrl+c
    process.on('SIGUSR1', processExitHandler); // SIGUSR1 and SIGUSR2 are for `kill pid` (ex: nodemon restart)
    process.on('SIGUSR2', processExitHandler);
    process.on('uncaughtException', processExitHandler);
    
    this.destroy
    停止Web服务器和数据库连接

    以下是我的监视脚本,用于编译/重新启动更改:

    "watch:build": "babel src --out-dir lib --source-maps --watch",
    "watch:run": "nodemon lib/index.js",
    "watch": "npm run watch:build & (sleep 1 && npm run watch:run)",
    
    我只是在pkg.json中添加了一个标志--delay 1500ms,它就成功了

    "scripts": {
        "start": "nodemon ./src/index.js --delay 2000ms"
    },
    

    终止进程将取决于您的环境,您是否可以发布更多关于此的信息。还有,你什么时候碰到这个问题的?还有其他东西在使用这个端口,你知道它是什么吗?你能阻止它从一开始就启动吗?我正在Ubuntu 16.04上运行最新的node和nodemon。我确切地知道是什么在使用这个端口——我刚刚杀死或崩溃的服务器。它不会消失。我现在正在工作-在过去的30分钟内,至少有40次我的应用程序退出/崩溃,当我尝试重新启动时,我出现了此错误,因此我关闭了CL上的端口,重新启动了Postman并再次启动循环。某种情况告诉我这是您的设置或其他方面的问题。当进程死亡时,它将释放端口,因此在崩溃(或简单地重新启动)后再次启动进程应该不是问题。你能告诉我们更多关于你的设置吗?也许给我们看一些代码或者你的package.json是如何设置来运行nodemon的。听起来他的进程实际上并没有消亡。它停止了,然后试图重新开始倾听是的,我知道如何终止这个过程。这不是问题所在。是的,如果我的车不能启动,我知道如何用锤子敲击喷油器。我正在寻找一个解决方案而不是锤子。你知道你的服务器中抛出了什么异常来捕获它吗?对不起,我该如何捕获它?这就是我所得到的:(见orig post)。这与我所寻找的第三种选择大致相同。不幸的是,现在还没有办法测试它。如果它开始这样做,我会把它扔进去试试。
    "scripts": {
        "start": "nodemon ./src/index.js --delay 2000ms"
    },