Nodejs:用了Forever,总是报一个错误
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)
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
上。这表示你试图绑定到一个已经被其他进程使用的端口。常见的原因包括:
- 应用程序没有正确地退出,导致端口被占用。
- 前一个实例的
forever
进程没有完全关闭。 - 其他服务或进程占用了该端口。
解决方案
解决这个问题有几种方法:
-
检查端口占用情况 使用命令行工具检查哪个进程占用了该端口。例如,在Linux系统中可以使用以下命令:
sudo lsof -i :<your_port_number>
或者在Windows系统中使用:
netstat -ano | findstr <your_port_number>
-
重启应用 确保所有相关的
forever
进程已经停止。你可以使用以下命令来停止所有forever
进程:forever stopall
-
修改代码以优雅地处理错误 在你的应用代码中,确保正确处理错误事件。例如,可以添加错误监听器来捕获并处理未处理的错误事件:
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 应用程序尝试在一个已经被其他进程占用的端口上监听。你需要检查当前系统中是否有其他应用或同一应用的其他实例占用了该端口。
解决步骤
-
查找占用端口的进程:
- 使用命令
lsof -i :端口号
或netstat -tuln | grep 端口号
来找到占用指定端口的进程。 - 例如,如果应用程序试图监听 3000 端口,则运行以下命令:
或者lsof -i :3000
netstat -tuln | grep 3000
- 使用命令
-
终止占用端口的进程:
- 如果发现有其他进程占用了该端口,你可以通过进程 ID(PID)来终止它。例如,如果你找到的 PID 是 1234,可以使用以下命令:
kill -9 1234
- 如果发现有其他进程占用了该端口,你可以通过进程 ID(PID)来终止它。例如,如果你找到的 PID 是 1234,可以使用以下命令:
-
修改应用配置:
- 如果上述步骤不能解决问题,检查你的
app.js
文件中的端口配置部分,确保使用的端口没有被硬编码,并且可以通过环境变量动态设置。 - 例如:
const port = process.env.PORT || 3000; app.listen(port, () => { console.log(`Server is running on port ${port}`); });
- 如果上述步骤不能解决问题,检查你的
-
重新启动应用:
- 修改配置后,使用 Forever 重启你的应用:
forever restartall
- 修改配置后,使用 Forever 重启你的应用:
示例代码
假设你有一个简单的 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 应用程序。