首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【NodeJs】启动本地服务遭遇端口占用怎么办⁉️

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

作者头像
前端小鑫同学
发布于 2022-12-26 03:47:14
发布于 2022-12-26 03:47:14
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~

写作背景:

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

涉及知识点:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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服务:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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服务失败的处理回调函数:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const onError = (e) => {
    if (e.code === 'EADDRINUSE') {
      //  TODO
    }
};

server.on('error', onError);
  1. 在失败的回调函数中当判断错误码为EADDRINUSEport进行自增:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 完善代码,在成功启动服务和遇到其他失败的情况将失败的监听移除,以为我们将不再需要:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()函数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C Primer Plus(七)
本篇,我们主要讨论字符串的性质、如何声明并初始化字符串、如何在程序中输入和输出字符串,以及如何操控字符串。
1ess
2021/11/01
7630
C语言字符串I\O
分析常用的处理字符串输入和输出的函数,以及如何结合这几个函数进行优化和设计一些新的处理字符串输入输出的函数。
CtrlX
2022/11/14
5K0
字符数组输入输出---fputs,gets_s,puts,fputs
都是从标准输入设备中接收。 接收的字符串结束之后都会自动在字符串的末尾追加’\0’作为字符串结束符。
大忽悠爱学习
2021/03/02
7280
字符数组输入输出---fputs,gets_s,puts,fputs
C/CPP输入输出函数汇总分析
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
CtrlX
2023/03/21
2.1K0
fgets函数的用法
【原文出处: http://www.cnblogs.com/coder-jhm1314/articles/4561006.html】
用户7886150
2021/02/12
2.3K0
要点3:输入函数对比与自定义输入方式
运行程序,输入 两个整数,打印为 2,测试输入3个值仍然打印2,是因为这个"%d %d"指定了只解析两个int,多余的将留在缓冲区中,如果后面再写一个scanf,将从缓冲区中继续解析。
CN_Simo
2020/08/20
8730
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数
半截诗
2024/10/09
2210
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
gets 、getchar 、fgets 、scanf的用法
https://www.cnblogs.com/-lyric/p/5118666.html
嵌入式与Linux那些事
2021/05/20
3.7K0
linux系统编程之基础必备(四):C 标准库IO缓冲区和内核缓冲区的区别
本文介绍了Linux C编程的基本语法和编程规范,包括变量、数组、字符串、函数、指针等,以及标准I/O库和输入输出流,还介绍了Linux C编程中的异常处理、多线程编程、网络编程等内容。
s1mba
2018/01/03
2.6K0
linux系统编程之基础必备(四):C 标准库IO缓冲区和内核缓冲区的区别
【熟视C语言】如何快速的了解一个库函数(C语言讲解,以string.h中的部分库函数为例)
C语言的库函数虽然不算多,但若能熟练掌握一部分,或者说能学会去了解库函数的使用,无论是对C语言的使用熟练程度还是自己代码能力的提升都是有帮助的。所以,本篇文章旨在向读者展示如何了解并熟练使用一个库函数,本篇文章以头文件string.h中的一部分库函数为例讲解。
Crrrush
2023/06/23
4220
【熟视C语言】如何快速的了解一个库函数(C语言讲解,以string.h中的部分库函数为例)
C语言fputs()和fgets()函数
写文件:fputs()函数 fputs()函数将一行字符串写入文件,它将字符串输出到流。
C语言与CPP编程
2020/12/02
6450
快速了解C语言基础知识-学习笔记
你是否想要揭开计算机编程的神秘面纱?那么,不妨从C语言开始,它是计算机编程的基石,带你领略编程的魅力和乐趣。接下来希望我的文章能让大家对C语言拥有有一定的认识。
LonlyMay
2024/10/21
7270
快速了解C语言基础知识-学习笔记
解决带空格的字符串输入问题:C/C++中的几种常用函数
在C/C++编程中,读取带空格的字符串一直是一个常见的问题。传统的 scanf 和 gets 函数在处理带空格字符串时往往会遇到一些限制和问题。为了更加安全地处理带空格的字符串输入,我们可以选择不同的方法,本文将详细介绍几种常用的解决方案,并展示它们的优缺点。
平凡之路.
2025/02/05
6200
【C语言】常见概念
目前已知已经有上千种计算机语言,人们通过计算机语言写的程序,给计算机下达指令,让计算机工作。
云边有个稻草人
2024/10/21
3010
【C语言】常见概念
C++字符串输入函数小结
看了网上有人写的,不是很全,而且还有几处错误,所以自己重新找了一下MSDN中的相关内容。
用户7886150
2021/02/17
9280
【C语言】C语言标准库大梳理(超全)
C89 标准库总共划分为 15 个部分,每个部分用一个头文件描述,C99 标准新增了 9 个(为了简化学习,这里暂不提 C11 标准),总共有 24 个头文件。
苏州程序大白
2022/04/14
2.9K0
【C语言】C语言标准库大梳理(超全)
C++中cin的详细用法
cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
恋喵大鲤鱼
2018/08/03
8.3K0
C++中cin的详细用法
C/CPP输入输出函数汇总分析
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
CtrlX
2022/11/11
1.4K0
【C语言】了解函数,认识函数
函数(function)的概念,有些翻译为:子程序,子程序这种翻译更加准确⼀些。C语言中的函数就是一个完成某项特定的任务的一小段代码。C语⾔的程序其实是由⽆数个小的函数组合而成的,也可以说:一个大的计算任务可以分解成若干个较小的函数(对应较小的任务)完成。
用户11367452
2024/11/21
2620
【C语言】了解函数,认识函数
C/C++ (stdio.h)标准库详解
cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备(如键盘、打印机、终端)或系统支持的任何其他类型的文件一起操作。
DevKevin
2024/03/19
1.3K0
C/C++ (stdio.h)标准库详解
相关推荐
C Primer Plus(七)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档