【问题标题】:Port "already in use" after each server restart每次服务器重新启动后端口“已在使用”
【发布时间】:2018-02-28 14:50:50
【问题描述】:

寻找特殊问题的帮助。每次我停止并重新启动服务器时,都会收到以下消息:

Jim@Jim-PC MINGW64 ~/nodeProjects/express-locallibrary-tutorial
$ npm start

> express-locallibrary-tutorial@0.0.0 start C:\Users\Jim\nodeProjects\express-locallibrary-tutorial
> node ./bin/www

Port 3300 is already in use
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! express-locallibrary-tutorial@0.0.0 start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the express-locallibrary-tutorial@0.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Jim\AppData\Roaming\npm-cache\_logs\2017-09-19T17_39_10_578Z-debug.log

我将端口更改为 3301,它可以工作。我停止并重新启动服务器并收到 3301 已在使用中的错误。我将端口更改为 3302,它可以工作。停止并启动并得到 3302 已在使用中的错误。

几天前我在另一个应用程序上停止使用 nodemon 来解决同样的问题,它也停止了。对于这个应用程序,我安装了 nodemon,但不是全局安装,遇到问题并将其卸载。但问题依然存在。

如果有人遇到此问题,我将不胜感激。

【问题讨论】:

  • 如果您在 Windows 上,请检查任务管理器以查看是否有任何其他节点进程正在运行。如果您在 *nix 上,请运行 ps -A | grep node 以查看哪些节点进程仍在运行。
  • 如果您使用的是 MING64,您应该在 Windows 的 cmd.exe 中尝试 this thread
  • 感谢您的回复。我使用 Bash 和命令提示符。 C:\> netstat -a 返回大约 45 个 127.0.0.1 引用,但没有一个包含我一直在使用的端口。我一直在使用的一些在本地地址 0.0.0.0 下列出。我看到 0.0.0.0:3000、0.0.0.0:3300、0.0.0.0:3302、0.0.0.0:3303。每个人的外国地址是 Jim-PC,(我的机器),并且状态是“正在侦听”。逐渐回暖?我不明白我正在查看的内容的含义,但看到端口号表明我的 PC 正在使用并保存 0.0.0.0:port#,并处于“正在侦听”状态。如果是这样,如何解决?
  • 您的应用程序中的某些东西正在生成您的服务器,然后在您的应用程序关闭时不会自行清理。您需要发布您的服务器创建代码以尝试找出导致此问题的原因。要解析占用的端口,请使用netstat -a -b 列出端口使用它的可执行文件。然后使用进程管理器杀死有问题的进程。
  • @gogaz 提供的链接有命令 --netstat -aon |查找 /i “听”。它只返回正在收听的内容,因此列表更易于管理。我运行了 netstat -a -b,它返回了一个很长的列表。此评论框不允许我复制屏幕截图。我不知道如何使用进程管理器来杀死任何东西。我上面列出的 0.0.0.0 包括这个列表中的 node.exe。

标签: node.js express


【解决方案1】:

如果您使用的是 nodemon - 您可以这样处理:

  1. 安装 kill-port 节点包作为开发依赖:

    npm install kill-port --save-dev
    
  2. 在项目的根目录中创建一个nodemon.json 文件,其中包含:

    {
      "events": {
        "restart": "kill-port 3000",
        "crash": "kill-port 3000"
      },
      "delay": "1500"
    }
    
  3. 然后,在您的 package.json 文件中,有这样的内容:

    "scripts": {
        "start-dev": "nodemon app.js",
    }
    
  4. 然后在开发模式下启动您的应用:

    npm run start-dev
    

【讨论】:

  • 经过这么长时间,感谢您发布这个都铎王朝!您体现了使该网站成为宝贵资源的社区精神。
  • 感谢@Tudor Constantin 的工作就像一个魅力
  • 不敢相信释放端口不是由 nodemon 本身处理的。感谢您的帮助,工作完美!
【解决方案2】:

nodemon 与参数--signal SIGKILL 一起使用已解决了我的问题。

喜欢;

"scripts": {
    "nodemon": "nodemon --signal SIGKILL"
  }

但我之前也有nodemonConfig,如下;

"nodemonConfig": {
    "exec": "npm run startDev",
    "watch": [
      "src/*"
    ]
  },

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 2021-12-30
    • 2015-11-04
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2022-11-03
    相关资源
    最近更新 更多