如果我运行一个端口80的服务器,我尝试使用XMLHttpRequest,我得到这个错误
为什么NodeJS会有问题,如果我想做一个请求,而我在端口80上运行一个服务器?对于网络浏览器来说,这不是问题:我可以在服务器运行时上网。
服务器为:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
请求是:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
sys.puts("State: " + this.readyState);
if (this.readyState == 4) {
sys.puts("Complete.\nBody length: " + this.responseText.length);
sys.puts("Body:\n" + this.responseText);
}
};
xhr.open("GET", "http://mywebsite.com");
xhr.send();
对于windows 10上的其他人来说,node是localhost,端口是3500,而不是80…
不奏效的:
killall ? command not found
ps -aux | grep 'node' ? ps: user x unknown
显示信息但仍然不起作用的:
ps -aef | grep 'node'
ps ax
kill -9 61864
哪些方法有效:
Git Bash或Windows上的Powershell
net -a -o | grep 3500 (whatever port you are looking for)
注意PID(最右边)
我不能让所有人都去工作……所以
打开任务管理器
在进程选项卡上,右键单击名称或任何列,并选择包含PID
按PID排序,然后右键单击右PID,然后单击结束任务。
现在,在windows上不那么有趣的练习之后,我意识到我可以使用任务管理器,找到Node引擎,然后结束它。
仅供参考,我使用Visual Studio代码在端口3500上运行节点,我在VS代码中使用Git Bash shell。我已经用Ctrl + C优雅地退出了,但有时这并不能杀死它。我不想改变我的端口或重新启动,所以这是有效的。希望它能帮助到其他人。否则就是我自己的文档。
错误EADDRINUSE(地址已在使用)报告本地系统上已经有另一个进程占用该地址/端口。
有一个叫做find-process的npm包可以帮助查找(并关闭)占用进程。
下面是一个小演示代码:
const find = require('find-process')
const PORT = 80
find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
我准备了一个小样本,可以重现EADDRINUSE错误。如果你在两个不同的终端上启动下面的程序,你会看到第一个终端将启动一个服务器(在端口“3000”上),而第二个终端将关闭已经运行的服务器(因为它阻止了第二个终端EADDRINUSE的执行):
最小工作示例:
const find = require('find-process')
const http = require('http')
const PORT = 3000
// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))