重新启动Node.Js应用程序会抛出EADDRINUSE错误

我知道我的问题重复。 标记为重复或任何内容之前,请完整阅读该问题。

我正在学习node.js来创buildrestapi和做得很好。一切都很顺利,直到我发现这个错误(EADDRINUSE)重新启动应用程序。 这个问题吃我宝贵的时间,但仍然无法find正确的修复。

如果应用程序第一次运行,它启动顺利,没有任何端口更改,由于某种原因,我们停止或重新启动应用程序这个错误信息,而从服务器抛出。 他们中的许多人build议只更改端口一切顺利,我也同意他们。但是,当服务器在全球范围内生效和使用时,您无法将端口更改为重新启动。

添加我的代码片段。

app.js

var express = require('express'); // call express var app = express(); // define our app using express var bodyParser = require('body-parser'); var config = require('./Config/config.js'); var api = require('./apis/api'); // configure app to use bodyParser() // this will let us get the data from a POST app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // ROUTES FOR OUR API // ============================================================================= var router = express.Router(); // get an instance of the express Router app.all('/api/write/'+config.WRITE_API_VERSION+'/:apiName', function (req, res) { api.handle.apply(null, ['write', req.method.toLowerCase(), req.params.apiName, req, res]); console.log("in api end1"+req.body); }); app.all('/api/read/'+config.READ_API_VERSION+'/:apiName', function (req, res) { api.handle.apply(null, ['read', req.method.toLowerCase(), req.params.apiName, req, res]); console.log("in api end2"); }); app.use(function (req, res, next) { res.contentType('application/json'); next(); }); // more routes for our API will happen here // REGISTER OUR ROUTES ------------------------------- // all of our routes will be prefixed with /api app.use('/api', router); // START THE SERVER // ============================================================================= app.listen(config.PORT); console.log('Magic happens on port ' + config.PORT); 

config.js

 var configs = { ENVIRONMENT: "development", READ_API_VERSION: "v1.0", WRITE_API_VERSION: "v1.0", PORT: 8080 } Object.freeze(configs); module.exports = configs; 

的package.json

 "scripts": { "start": "node app.js" } 

错误信息

 node app.js Magic happens on port 8080 events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoException (net.js:901:11) at Server._listen2 (net.js:1039:14) at listen (net.js:1061:10) at Server.listen (net.js:1135:5) at EventEmitter.listen (/home/ubuntu/vcare_backend/VCare/node_modules/express/lib/application.js:617:24) at Object.<anonymous> (/home/ubuntu/vcare_backend/VCare/app.js:47:5) 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) 

运行命令sudo netstat -plnt后

 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3277/node tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1073/sshd tcp6 0 0 :::22 :::* LISTEN 1073/sshd 

您的问题是该节点已经在端口8080上运行。这由netstat / lsof命令返回的第一行显示。 杀死进程将允许您重新启动节点进程。 您可以使用该命令在Mac上执行此操作

 killall node 

其中节点是进程的名称。

节点已经在您的机器上运行。

在terminal中,find正在运行的节点进程
ps -ax | grep node

这将返回正在运行的节点进程的列表。 进程列表中的第一列是进程标识(pid)。

杀死正在运行的节点进程
kill -9 <pid>

这将杀死节点进程并释放您的端口来运行您的服务器。