Nodejs:用了Forever,总是报一个错误

发布于 1周前 作者 vueper 来自 nodejs/Nestjs

Nodejs:用了Forever,总是报一个错误

错误代码,大虾们看看是嘛问题,app.js没什么特别的代码啊,错误的日志很短的时间内就有10M了,CPU占用100%:

events.js:66
    throw arguments[1]; // Unhandled 'error' event
                   ^

Error: listen EADDRINUSE

at errnoException (net.js:768:11) at Server._listen2 (net.js:908:14) at listen (net.js:935:10) at Server.listen (net.js:984:5) at Object.<anonymous> (/home/hello/application/app.js:1:813) at Module._compile (module.js:449:26) at Object.Module._extensions…js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10)


4 回复

Node.js:用了Forever,总是报一个错误

问题描述

最近在使用Node.js项目时,我尝试用forever来保持应用的持续运行。然而,我遇到了一个问题:每次启动应用时,都会出现错误日志,并且这些日志增长得非常快,短时间内就达到了10MB大小。同时,CPU的占用率也达到了100%。

错误信息如下:

events.js:66
    throw arguments[1]; // Unhandled 'error' event
                   ^
Error: listen EADDRINUSE
    at errnoException (net.js:768:11)
    at Server._listen2 (net.js:908:14)
    at listen (net.js:935:10)
    at Server.listen (net.js:984:5)
    at Object.<anonymous> (/home/hello/application/app.js:1:813)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.runMain (module.js:492:10)

分析

从错误信息来看,问题出在listen EADDRINUSE上。这表示你试图绑定到一个已经被其他进程使用的端口。常见的原因包括:

  1. 应用程序没有正确地退出,导致端口被占用。
  2. 前一个实例的forever进程没有完全关闭。
  3. 其他服务或进程占用了该端口。

解决方案

解决这个问题有几种方法:

  1. 检查端口占用情况 使用命令行工具检查哪个进程占用了该端口。例如,在Linux系统中可以使用以下命令:

    sudo lsof -i :<your_port_number>

    或者在Windows系统中使用:

    netstat -ano | findstr <your_port_number>
  2. 重启应用 确保所有相关的forever进程已经停止。你可以使用以下命令来停止所有forever进程:

    forever stopall
  3. 修改代码以优雅地处理错误 在你的应用代码中,确保正确处理错误事件。例如,可以添加错误监听器来捕获并处理未处理的错误事件:

    const http = require('http');
    
    const server = http.createServer((req, res) => {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end('Hello World\n');
    });
    
    server.on('error', (err) => {
        console.error('Server error:', err);
        process.exit(1);  // 退出进程
    });
    
    server.listen(3000, () => {
        console.log('Server listening on port 3000');
    });

通过以上步骤,你应该能够解决由于端口占用导致的错误,并确保你的应用能够在出现问题时正确地处理错误。


会不会上有 forever 有应用正运行在同个端口没关…

用forever stop/stopall有时候会结束不了进程,还是得killall node~

根据你提供的错误信息 Error: listen EADDRINUSE,这个错误通常表示你的 Node.js 应用程序尝试在一个已经被其他进程占用的端口上监听。你需要检查当前系统中是否有其他应用或同一应用的其他实例占用了该端口。

解决步骤

  1. 查找占用端口的进程

    • 使用命令 lsof -i :端口号netstat -tuln | grep 端口号 来找到占用指定端口的进程。
    • 例如,如果应用程序试图监听 3000 端口,则运行以下命令:
      lsof -i :3000
      或者
      netstat -tuln | grep 3000
  2. 终止占用端口的进程

    • 如果发现有其他进程占用了该端口,你可以通过进程 ID(PID)来终止它。例如,如果你找到的 PID 是 1234,可以使用以下命令:
      kill -9 1234
  3. 修改应用配置

    • 如果上述步骤不能解决问题,检查你的 app.js 文件中的端口配置部分,确保使用的端口没有被硬编码,并且可以通过环境变量动态设置。
    • 例如:
      const port = process.env.PORT || 3000;
      app.listen(port, () => {
        console.log(`Server is running on port ${port}`);
      });
  4. 重新启动应用

    • 修改配置后,使用 Forever 重启你的应用:
      forever restartall

示例代码

假设你有一个简单的 Express 应用:

// app.js
const express = require('express');
const app = express();

const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

确保在启动时设置了正确的端口:

export PORT=3000
forever start app.js

通过这些步骤,你应该能够解决 EADDRINUSE 错误并正常运行你的 Node.js 应用程序。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!