Node.js http 模块详解(1)

news2024/11/29 12:40:03

http 模块

使用 Node.js 中创建 Web 服务,主要依赖内置的 http 模块。经典的 express.js、koa.js 框架都是以 http 模块为核心,进行的不同程度的封装。

创建一个最简单的 Web 服务只需要几行代码。新建一个 index.js 文件,输入以下内容:

// 1.导入 http 模块
const http = require('http');

// 2. 调用 createServer 方法创建服务
const server = http.createServer((request, response) => {
    // 3.响应给浏览器的内容
	response.end('Hello, World'); 
});

// 4.执行 listen 方法,启动服务
server.listen(3000, () => {
    console.log('服务器启动成功:http://localhost:3000')
})

然后打开命令行工具,使用 node 命令执行该文件:

node index.js

命令行工具中会打印:

服务器启动成功:http://localhost:3000

之后打开浏览器,访问 http://localhost:3000,就能看到以下内容:

image-20230201141136913

到这里,只需件简简单单的 6 行代码,就创建了一个 web 服务。

createServer 方法

可以看到,创建 Web 服务的核心方法就是 createServer 方法。

它接收一个回调函数,回调参数接收两个参数,分别是 :

  • request 对象:表示 HTTP 请求对象,里面包含了客户端本次请求携带的信息
  • response 对象:表示 HTTP 响应对象,用于向客户端设置响应的信息

这个回调函数,就是处理 http 请求,设置 http 响应的主要场所。所以,编写 web 服务,其实就是在不停的在这个函数中处理请求和响应内容。这也是基于 HTTP 协议本身的请求-响应模型所决定的。当然,实际开发中肯定不能这么杂糅的写,都是使用框架,那会有很合理的中间件机制和分层。

listen 方法

我们都知道,TCP 协议是 HTTP 协议的底层协议,所有 HTTP 请求的数据都是利用 TCP 传输的。要发送 HTTP 请求,必须先建立 TCP 连接

Node 中要创建 HTTP 服务也是如此。createServer 方法执行后会创建一个 Server 类的实例,该 Server 类又继承自另一个内置模块 net 中的 Server 类,它身上有一个 listen 方法。下面是相关的类型声明,可以理解这其中的关系。

// net 模块

class Server extends EventEmitter {
 
        /**
         * 启动服务器监听连接。此 Server 可以是 TCP 或 IPC 服务器,具体取决于它所监听的内容。
         */
        // 有若干重载,这是最常使用的一种方法
        listen(port?: number, hostname?: string, listeningListener?: () => void): this;
        listen(port?: number, listeningListener?: () => void): this;
}


// http 模块
import { Server as NetServer } from 'node:net';

function createServer<
        Request extends typeof IncomingMessage = typeof IncomingMessage,
        Response extends typeof ServerResponse = typeof ServerResponse,
    >(requestListener?: RequestListener<Request, Response>): Server<Request, Response>;
      
class Server<
        Request extends typeof IncomingMessage = typeof IncomingMessage,
        Response extends typeof ServerResponse = typeof ServerResponse,
    > extends NetServer {}

所以通过 createServer 方法创建了服务之后,还要继续调用 listen 方法,用于启动该服务,监听连接

它有多种重载,最常用的一种就是监听一个端口,在启动成功后,执行回调函数:

server.listen(3000, () => {
    console.log('服务器启动成功:http://localhost:3000')
})

如果服务启动失败,比如出现端口占用时,控制台中会直接报错,就不再执行后面的回调函数了。

再介绍两种其他的重载,使用的并不多。

一种是不指定端口号,此时操作系统会随机分配一个可用的端口号。在服务启动成功后,可以通过 server.address().port 属性来获得分配的端口号:

server.listen(() => {
    const port = server.address().port
	console.log(port)
	console.log('服务器启动成功:http://localhost:', port)
})

试一下:

image-20230201150525819

一种是指定要监听的主机名

当不指定 host 时,默认为 0.0.0.0(IPv4)或者 ::(IPv6),支持网络中所有的主机进行访问

如果设置为 locolhost 或者 127.0.0.1,则只能自己的主机访问。

server.listen(3000, 'localhost', () => {
	console.log('服务器启动成功:http://localhost:', port)
})

总结

我们介绍了 http 模块的基本用法,主要使用 createServer 来创建服务,再调用 listen 方法来启动服务,监听连接。createServer 接收回调函数用来具体处理某一个请求,编写 web 服务主要就是利用回调函数的两个参数 requestresponse ,后面会详细介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GCC】3: webrtc带宽(预估调整)和GCC模块

webrtc源码分析(8)-拥塞控制(上)-码率预估 bandwidth bitrate estimator 整体码控流程 webrtc源码分析(8)-拥塞控制(上)-码率预估 大神绘制的: TWCC TCC算法的流程 TccEstimator 大神用go写的:Transport-CC Algorithm Description This is a Goog

python小游戏——打砖块代码开源

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿所有的美好&#…

Redis单线程还快的原因

Redis单线程还快的原因 Redis Server是多线程的&#xff0c;Redis单线程指的是请求处理整个流程是单线程的&#xff01; 单线程还快的原因 纯内存操作&#xff1a; Redis数据存储在内存中&#xff0c;速度很快。 非阻塞IO多路复用机制&#xff1a; Redis 采用了多路复用机制&a…

从事互联网行业,考一个PMP会有帮助吗?

PMP是项目管理类证书&#xff0c;不要求工作岗位&#xff0c;只要涉及项目、项目管理岗位&#xff0c;就可以考PMP证书&#xff0c;就会有帮助。但这里先说一下PMP的报名条件&#xff0c;先看能不能考&#xff0c;再说考了是否有帮助。 条件如下图&#xff0c;有两个&#xff…

睿智的目标检测64——目标检测中的MixUp数据增强方法

睿智的目标检测64——目标检测中的MixUp数据增强方法学习前言代码下载什么是MixUp数据增强方法实现思路全部代码1、数据增强与MixUp2、调用代码学习前言 哈哈哈&#xff01;我再来一次数据增强&#xff01; 代码下载 https://github.com/bubbliiiing/object-detection-augm…

HTML5+CSS3(八)-全面详解(学习总结---从入门到深化)

领取详细资料 请关注一下公众号 &#xff01;&#xff01;&#xff01; 目录 领取详细资料 请关注一下公众号 &#xff01;&#xff01;&#xff01; 关系选择器 关系选择器分类 后代选择器 定义 语法 子代选择器 定义 语法 相邻兄弟选择器 定义 语法 通用兄弟选择…

Python爬虫教你爬取视频信息

大家好&#xff0c;我是拉斯&#xff0c;今天分享一个爬取某音视频的一个小案例&#xff0c;大家一起学习 目录前言基本环境配置爬取目标视频获取视频链接1.查看网页源代码2.抓包工具捕捉下载视频(以mp4格式进行保存)获取其他信息并打印(作者名&#xff0c;作品名&#xff0c;…

沁恒CH32V307使用记录:GPIO与EXTI

文章目录目的GPIO&#xff08;通用输入输出接口&#xff09;基础说明初始化输出输入与电平读取锁定机制EXTI&#xff08;外部中断&#xff09;基础说明使用演示总结目的 GPIO是单片机最基础的功能&#xff0c;EXTI最常用的场景就是GPIO用于输入时使用。这篇文章将对CH32V307中…

【i18n】使用 vue-i18n 实现国际化多语言切换

学习关键语句: i18n 进行多语言国际化 使用 vue-i18n 语言切换 写在前面 由于以前没有过国际化的经验 , 所以第一次遇到的时候还是有点懵逼的 , 赶紧在网上转了一大圈 , 分享给大家一点点我的使用经验 我写这篇文章的目的是大家看了之后跟着步骤走就能完成多语言切换的任务 …

闭眼时长标准差脚本

闭眼时长标准差脚本 闭眼时长标准差 平均闭眼时长&#xff1a;识别一分钟内闭眼次数以及每次闭眼的时长&#xff0c;将每次闭眼的时长进行累计相加&#xff0c;最终再取平均值 闭眼标准差公式 闭眼标准差((n1−navg)2(n2−navg)2...)∗1/n闭眼标准差\sqrt{((n_1-n_{avg})^2(…

【广度优先搜索】N叉树的层序遍历 | 腐烂的橘子 | 单词接龙 | 最小基因变化 | 打开转盘锁

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

jenkins打包构建springboot项目为docker镜像并上传nexus私服

前提&#xff1a;jenkins,docker,nexus都已经搭建完毕 一. 开启docker远程访问 1.修改docker.service文件 Docker 安装成功之后&#xff0c;首先需要修改 Docker 配置来开启允许远程访问 Docker 的功能。     文件位置&#xff1a;/lib/systemd/system/docker.service    …

JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

JVM&#xff08;Java虚拟机&#xff09; JVM 内存模型 结构图 jdk1.8 结构图&#xff08;极简&#xff09; jdk1.8 结构图&#xff08;简单&#xff09; JVM&#xff08;Java虚拟机&#xff09;&#xff1a; 是一个抽象的计算模型。如同一台真实的机器&#xff0c;它有自己…

使用比console.log更优质的前端调试方案

程序调试是程序开发必不可少的一环&#xff0c;刚开始接触前端调试时&#xff0c;最常用的就是 console.log 打印变量进行调试&#xff0c;本文会分享一些笔者学习到的前端调试方法&#xff0c;减少对 console.log 调试方式的依赖&#xff0c;选择更优质的前端调试方案。 本文中…

Android开发进阶——RxJava核心架构分析

简介 RxJava是对响应式扩展&#xff08; Reactive Extensions&#xff0c;称之为 ReactiveX &#xff09;规范的Java 实现&#xff0c;该规范还有其他语言实现&#xff1a;RxJS、Rx.Net、RxScala、RxSwift等等&#xff08;也即&#xff0c;ReactiveX 定义了规范&#xff0c;其他…

pip安装时报错 ascii‘ codec can‘t decode byte 0xe2 in position...

在使用pip安装包的时候报错ascii’ codec can’t decode byte 0xe2 in position… 报错信息 UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe2 in position 1429: ordinal not in range(128) 以前好像见过类似的情况&#xff0c;所以搜了一下怎么修改python默认…

聊聊ChatGPT

最近ChatGPT火出圈。 在过去三个月里&#xff0c;眼见着它的热度火箭一般蹿升&#xff0c;据瑞银上周三发布的报告显示&#xff0c;GPT已经超过了Tiktok&#xff0c;成为人类有史以来最快突破1亿月活跃用户的互联网产品。Tiktok当初用了9个月&#xff0c;而GPT只用了2个月。 …

Spring使用了哪些设计模式?

目录Spring中涉及的设计模式总结1.简单工厂(非23种设计模式中的一种)2.工厂方法3.单例模式4.适配器模式5.装饰器模式6.代理模式7.观察者模式8.策略模式9.模版方法模式Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式&#xff1a; BeanFactory。Spri…

go-grpc的使用和学习

文章目录基础知识&#xff1a;操作流程安装proto文件配置grpc&#xff1a; 正常客户端发送数据(以字节流的方式)&#xff0c;服务器接受并解析&#xff0c;根据约定知道要执行什么&#xff0c;然后把结果返回给客户 rpc将上述过程封装&#xff0c;使其操作更加优化&#xff0c;…

Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

各位朋友你们好呀。今天是立春&#xff0c;明天就是正月十五元宵节了&#xff0c;这种立春 元宵相隔的时候&#xff0c;可是很难遇到的&#xff0c;百年中就只有几次。在这提前祝大家元宵快乐。 今天给大家带来的是Vue 3 中的极致防抖/节流&#xff08;含常见方式防抖/节流&a…