我知道我的问题是重复的。在标记为重复或任何内容之前,请完整阅读该问题。
我正在学习node.js来创建rest api&做得很好。一切顺利,直到我在重新启动应用程序时发现此错误(EADDRINUSE)。这个问题吃了我宝贵的时间,但仍然无法找到正确的解决方案。
如果应用程序第一次运行,它会顺利启动,不会因为某些原因而导致任何端口更改,我们会在从服务器抛出此错误消息时停止或重新启动应用程序。他们中的许多人建议只更改端口一切顺利,我同意他们。但当服务器是活的&在全球范围内使用,您无法更改端口以重新启动。
添加我的代码片段。
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
答案 0 :(得分:1)
您的问题是该节点已在端口8080上运行。这由netstat / lsof命令返回的第一行显示。杀死进程将允许您重新启动节点进程。您可以使用命令
在Mac上执行此操作killall node
其中node是进程的名称。
答案 1 :(得分:1)
节点已在您的计算机上运行。
在终端中,找到正在运行的节点进程
ps -ax | grep node
这将返回正在运行的节点进程列表。生成的进程列表中的第一列是进程ID(pid)。
使用终止正在运行的节点进程
kill -9 <pid>
这将终止节点进程并释放端口以便您运行服务器。