【NodeJs】启动本地服务遭遇端口占用怎么办⁉️

简介: 【NodeJs】启动本地服务遭遇端口占用怎么办⁉️

写作背景:


     在目前的众多前端工程化CLI中大多都提供在本地启动静态服务来辅助开发中页面的渲染,这些个CLI在遇到本地的端口占用的时候往往采用端口自增来重新启动服务。我相信这个现象在你开发项目的过程中也一定遇到过,如果没有遇到那你有没有发现控制台抛出包含“EADDRINUSE”的错误呢?


涉及知识点:


     在你在使用NodeJs做服务开发的过程中可能会遇到一个名为EADDRINUSE的错误,EADDRINUSEerror address in use的缩写,当我们重复启动同一个服务的时候会遭遇这个问题。意思就是已经有相同服务在监听这个端口、地址、处理器了,在NodeJs中文网的serverlisten模块下得知,处理这种问题的通常做法是延迟重试。下面是对应的示例代码:

server.on('error', (e) => {
  if (e.code === 'EADDRINUSE') {
    console.log('Address in use, retrying...');
    setTimeout(() => {
      server.close();
      server.listen(PORT, HOST);
    }, 1000);
  }
});
复制代码


实现分析:


     通过上面的示例代码可以看出要想对端口实现自增后重启服务的效果的处理位置就在error的回调监听里面操作,当我们监听到抛出EADDRINUSE的错误后,将PORT自增后重新执行listen函数。同样在NodeJs中文网中提示:当且仅当在第一次调用 server.listen() 期间出现错误或调用 server.close() 时,才能再次调用 server.listen() 方法。 否则,将抛出 **ERR_SERVER_ALREADY_LISTEN **错误。


让启动服务不再尴尬:


  1. 构建一个基础的http服务:
const http = require('http');
let port = 3000;
const server = http.createServer((request, response) => {
    response.writeHead(200, {
        'Content-Type': 'text/plain;charset=utf-8',
    });
    response.end('欢迎访问');
});
server.listen(port, () => {
    console.log(`> Local: http://localhost:${port}`);
});
复制代码
  1. 注册一个http服务失败的处理回调函数:
const onError = (e) => {
    if (e.code === 'EADDRINUSE') {
      //  TODO
    }
};
server.on('error', onError);
复制代码
  1. 在失败的回调函数中当判断错误码为EADDRINUSEport进行自增:
const onError = (e) => {
    if (e.code === 'EADDRINUSE') {
        console.log(`Port ${port} is in use, trying another one...`);
        server.listen(++port);
    } else {
        console.log('其他错误:', e);
    }
};
复制代码
  1. 完善代码,在成功启动服务和遇到其他失败的情况将失败的监听移除,以为我们将不再需要:
const http = require('http');
let port = 3000;
const server = http.createServer((request, response) => {
    response.writeHead(200, {
        'Content-Type': 'text/plain;charset=utf-8',
    });
    response.end('欢迎访问');
});
const onError = (e) => {
    if (e.code === 'EADDRINUSE') {
        console.log(`Port ${port} is in use, trying another one...`);
        server.listen(++port);
    } else {
        console.log('其他错误:', e);
    }
};
server.listen(port, () => {
    server.removeListener('error', onError);
    console.log(`> Local: http://localhost:${port}`);
});
复制代码


扩展学习:


     Vite就是使用这种方式来处理端口占用的构建工具,具体的代码可以参考vite项目的packages\vite\src\node\http.ts模块中的httpServerStart()函数。



相关文章
|
4月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
|
3月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
4月前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
63 5
|
4月前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
1月前
|
安全 Linux 网络安全
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息
nmap 是一款强大的开源网络扫描工具,能检测目标的开放端口、服务类型和操作系统等信息。本文分三部分介绍 nmap:基本原理、使用方法及技巧、实际应用及案例分析。通过学习 nmap,您可以更好地了解网络拓扑和安全状况,提升网络安全管理和渗透测试能力。
121 5
|
2月前
|
缓存 负载均衡 应用服务中间件
Nginx 实现一个端口代理多个前后端服务
【10月更文挑战第19天】Nginx 的强大功能不仅限于此,它还可以与其他技术和工具相结合,为我们的应用提供更强大的支持和保障。在不断发展的互联网时代,掌握 Nginx 的使用技巧将为我们的工作和生活带来更多的便利和效益。
|
3月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
47 0
Node服务连接Mysql数据库
|
4月前
|
监控 JavaScript 前端开发
深入浅出Node.js: 打造高效的后端服务
【8月更文挑战第27天】在这个数字化飞速发展的时代,后端技术成为支撑互联网服务的基石。Node.js作为其中的佼佼者,以其非阻塞I/O模型、事件驱动架构和丰富的生态系统,赢得了开发者的青睐。本文将带领读者深入理解Node.js的核心概念,通过实际案例分析其应用模式,并探讨如何利用Node.js构建高效、可扩展的后端服务。无论你是初学者还是有经验的开发者,都能在这篇文章中找到提升你的Node.js技能的灵感和知识。
|
4月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的深度整合
【8月更文挑战第27天】 在现代Web开发中,后端服务的高效性至关重要。本文深入探讨了如何利用Node.js的非阻塞I/O特性和Express框架的简洁性来打造高性能的后端服务。我们将通过具体案例,展示如何在不牺牲代码可读性和可维护性的前提下,实现高效的请求处理和服务端逻辑。文章旨在为开发者提供一个清晰的指导,帮助他们在构建后端服务时做出更明智的技术选择。
|
4月前
|
存储 缓存 JavaScript
构建高效后端服务:Node.js与Express框架的实战应用
【8月更文挑战第2天】在数字化时代的浪潮中,后端服务的构建成为了软件开发的核心。本文将深入探讨如何利用Node.js和Express框架搭建一个高效、可扩展的后端服务。我们将通过实际代码示例,展示从零开始创建一个RESTful API的全过程,包括路由设置、中间件使用以及数据库连接等关键步骤。此外,文章还将触及性能优化和安全性考量,旨在为读者提供一套完整的后端开发解决方案。让我们一同走进Node.js和Express的世界,探索它们如何助力现代Web应用的开发。