在使用 Node.js 开发时,经常会遇到 “Error: listen EADDRINUSE” 错误,这个错误一般是由于端口被占用导致的。本文将介绍这个错误的解决方案,并给出详细的示例代码,以帮助读者更好地理解和解决这个问题。
错误信息
首先,我们来了解一下这个错误的具体信息。当我们运行 Node.js 代码时,如果端口被占用,会出现如下错误信息:
-- -------------------- ---- ------- ------------- ----- --- -- --------- ------- ----- - ------ ------ ----------- ------- ------- -- --- -------------- -- ------------------------ --- --------- ---------------- -- --------------- ---------------- -- -------- --------------- -- ------------------------- --------------------------------------- ------- ------- ----- --- -- ----------- --------------- -- ------------------------- --------------------------------------- - ----- ------------- ------ ------------- -------- --------- -------- ------------ ----- ---- -
其中,最重要的信息是:
- 错误代码:EADDRINUSE
- 错误信息:address already in use 127.0.0.1:3000
- 错误位置:at Server.setupListenHandle [as _listen2] (net.js:1318:16)
根据这些信息,我们可以知道,这个错误是由于端口 (3000) 已经被占用导致的。
解决方案
针对这个问题,有以下几种解决方案。
方案一:修改端口号
最简单的解决方案是修改端口号,将原来的端口号改成其他未被占用的端口号。
const http = require('http'); const server = http.createServer((req, res) => { res.end('Hello World'); }).listen(4000); // 将端口号改成 4000 console.log('Server is running on http://127.0.0.1:4000');
运行上述代码,可以看到控制台输出了服务器的地址和端口号。
方案二:杀死占用端口的进程
如果不想修改端口号,可以查找并杀死占用该端口的进程。在 Linux 或 macOS 系统下,可以使用以下命令:
lsof -i:3000 kill -9 <PID>
其中,lsof 命令可以查找占用 3000 端口的进程,kill 命令可以杀死该进程。Windows 系统类似,可以使用 netstat 命令查找占用端口的进程 id,并使用 Taskkill 命令杀死该进程。
方案三:使用 express 或 koa.js 等框架
使用 express 或 koa.js 等 Node.js 框架可以避免这个错误,这是因为这些框架可以处理多个请求,并自动管理端口的使用。
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- ------------ ----- ---- -- - --------------- ------- -- ---------------- -- -- - ------------------- -- ------- -- ------------------------ --
运行上述代码,可以看到控制台输出了服务器的地址和端口号。
总结
总之,针对 “Error: listen EADDRINUSE” 错误,我们可以通过修改端口号、杀死占用端口的进程或使用 Node.js 框架来解决。同时,在使用 Node.js 开发时,应该注意避免出现该错误,以确保代码的正常运行。
示例代码:https://gist.github.com/ArmandXiao/f0c0897ef2b1ee534d7e94f3f36769e5
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6533619f7d4982a6eb6e82e5