node.js——http模块

news2024/11/17 13:39:15

文章目录

    • 什么是 http 模块
    • 创建最基本的 Web 服务器
    • request 请求对象
    • response 响应对象
    • 解决中文乱码问题
    • 根据不同的 url 响应不同的 html 内容
    • 文件上传实战

什么是 http 模块

http 模块是 Node.js 官方提供的、用来创建 Web 服务器的模块。
node.js提供了http模块,其中封装了一个http服务器和一个建议的http客户端。
http.server是一个基于事件的http服务器,内部由c++实现,接口由JavaScript封装。
http.request则是一个http客户端工具,用户向服务器发送请求。

HTTP 模块提供了 5 个类:

  1. http.Agent:创建全局实例,以管理 HTTP 客户端连接的持久性和复用,
  2. http.ClientRequest:当 http.request() 或 http.get() 被调用时,会创建 http.ClientRequest 对象。
  3. http.Server:当使用 http.createServer() 创建新的服务器时,通常会实例化并返回此类。
  4. http.ServerResponse
  5. http.IncomingMessage:http.serverRqueste()

http.serve的事件

http.server 是一个基于事件的http服务器,所有请求都被封装成独立的事件,开发者只有对它的事件编写相应函数,实现http服务器的所有功能。它继承于EventEmitter,提供了以下事件:

  1. request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.IncomingMessage(http.ServerResponse)的实例,表示请求和响应信息;就是我们常用的http.createServer([requestListener])模块;
  2. connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例(底层协议底下)
  3. close:当服务器关闭时,该事件被触发,除此之外还有checkContinue、upgrade、clientError事件
  4. listen()启动服务器监听
    • server.listen(prot,host,backlog,callback) 启动服务器监听
    • port:监听的端口号,0表示为服务器随机分配一个端口号。
    • host:监听的地址,默认为本机(localhost)
    • backlog:指定位于等待队列中的客户端连接的最大数量。超过此数量,则服务器拒绝新的客户端请求。
    • callback:开启监听后触发的回调函数。当服务器开启监听后会触发listening事件,可以通过监听listening事件来代替callback回调函数。

创建最基本的 Web 服务器

  1. 导入 http 模块
    如果希望使用 http 模块创建 Web 服务器,则需要先导入它:
    	const http = require('http')
    
  2. 创建 Web 服务器实例
    const server = http.createServer()
    
  3. 为服务器绑定 request 事件,监听客户端的请求
    // 使用服务器实例 .on() 方法,为服务器绑定一个 request 事件
    server.on('request',(req,res)=>{
    	//只要有客户端来请求我们自己的服务器,就会触发 request 事件,从而调用这个事件处理函数
    	console.log('Someone visit our web server.')
    })
    
  4. 启动服务器
    //调用 server.listen(端口号,cb回调)方法,即可启动 Web 服务器
    server.listen(80,()=>{
    	console.log('http server running at http://127.0.0.1')
    })
    

request 请求对象

在向服务器发送请求时,我们会携带很多信息,比如:

  • 本次请求的URL,服务器需要根据不同的URL进行不同的处理;
  • 本次请求的请求方式,比如GET、POST请求传入的参数和处理的方式是不同的;
  • 本次请求的headers中也会携带一些信息,比如客户端信息、接受数据的格式、支持的编码格式等;

只要服务器接收到了客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数。如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式:

const http = require('http')
const server = http.createServer()
server.on('request',()=>{
	// req.url 是客户端请求的 URL 地址
	const url = req.url
	// req.method 是客户端请求的 method 类型
	const method = req.method
	const str = `Your request url is ${url},and request method is ${method}`
	console.log(str)
})
server.listen(80,()=>{
	console.log('server running at http://127.0.0.1')
})

但当打开页面的时候,会发现我们并没有拿到东西,或者说客户端没有响应一些内容,这我们就要用到下面的方法。

response 响应对象

在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:

const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
	// req.url 是客户端请求的 URL 地址
	const url = req.url
	// req.method 是客户端请求的 method 类型
	const method = req.method
	const str = `Your request url is ${url},and request method is ${method}`
	console.log(str)
	// 调用 res.end() 方法,向客户端响应一些内容,并结束指定内容
	res.end(str)
})
server.listen(80,()=>{
	console.log('server running at http://127.0.0.1')
})

在这里插入图片描述

解决中文乱码问题

const http = require('http')
const server = http.createServer()
	server.on('request',(req,res)=>{
	// 定义一个字符串,包含中文内容
	const str = `您请求的 URL 地址是 ${req.url}, 请求的 method 类型为 ${req.method}`
	// 调用 res.end() 方法来讲内容响应给客户端
	res.end(str)
})
server.listen(80,()=>{
	console.log('server running at http://127.0.0.1')
})

在这里插入图片描述

会发现这里面都是乱码,此时我们就要设置响应头来解决乱码问题

const http = require('http')
const server = http.createServer()
server.on('request',(req,res)=>{
	// 定义一个字符串,包含中文内容
	const str = `您请求的 URL 地址是 ${req.url}, 请求的 method 类型为 ${req.method}`
	// 为了解决中文乱码问题,需要设置响应头 Content-Type 的值为 text/html;charset=utf-8
	res.setHeader('Content-Type','text/html;charset=utf-8')
	// 调用 res.end() 方法来讲内容响应给客户端
	res.end(str)
})
server.listen(80,()=>{
	console.log('server running at http://127.0.0.1')
})

在这里插入图片描述

根据不同的 url 响应不同的 html 内容

const http = require('http')
const server = http.createServer()
	server.on('request',(req,res)=>{
	//获取请求的 url 地址
	const url = req.url
	//设置默认的内容为 404 Not Found
	let content = '<h1>404 Not Found</h1>'
	//如果用户请求的是首页
	if (url === '/' || url === '/index.html') {
		content = '<h1>首页</h1>'
	} else if (url === '/about.html') { //如果用户请求的是关于页面
		content = '<h1>关于页面</h1>'
	}
	res.setHeader('Content-Type','text/html;charset=utf-8')
	res.end(content)
})
server.listen(80,()=>{
	console.log('server running at http://127.0.0.1')
})

这时我们已经可以从服务器内切换不同的页面。
在这里插入图片描述
在这里插入图片描述

文件上传实战

axios库可以在浏览器中使用,也可以在Node中使用:

  • 在浏览器中,axios使用的是封装xhr;
  • 在Node中,使用的是http内置模块;
const http = require('http')
const fs = require('fs')
const qs = require('querystring')
const server = http.createServer((req, res) => {
    if (req.url === '/upload') {
        if (req.method === 'POST') {
            req.setEncoding('binary')
            let body = ''
            const boundary = req.headers['content-type'].split(';')[1].replace(' boundary=', '')
            // console.log(boundary)
            req.on('data', (data) => {
                body += data
            })
            // 监听写入结束
            req.on('end', () => {
                // 1.获取image/png的位置
                const payload = qs.parse(body, "\r\n", ": ")
                const type = payload["Content-Type"]
                const typeIndex = body.indexOf(type) // 拿到image/jpeg的索引位置
                const typeLength = type.length // 拿到image/jpeg这个字符串的长度
                let imageData = body.substring(typeIndex + typeLength)
                // 3. 将image/jpeg后面的两个空格去掉
                // imageData = imageData.replace('\r\n\r\n', '')
                imageData = imageData.replace(/^\s\s*/, '')
                // 4. 将最后的boundary去除掉
                imageData = imageData.substring(0, imageData.indexOf(`--${boundary}--`))
                fs.writeFile('./foo.jpg', imageData, {encoding: 'binary'}, (err) => {
                    res.end('文件上传成功~')
                })
                console.log('文件上传成功')
                res.end('文件上传成功')
            })
        }
    }
})
server.listen(8000, '0.0.0.0', () => {
    console.log('文件上传服务器开启成功')
})

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

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

相关文章

【VCS Verdi】VCS Verdi 联合仿真总结

1. VCS 介绍VCS是编译型 Verilog 模拟器&#xff0c;它完全支持 OVI 标准的 Verilog HDL 语言、PLI 和 SDF。VCS 具有行业中较高的模拟性能&#xff0c;其出色的内存管理能力足以支持千万门级的 ASIC 设计&#xff0c;而其模拟精度也完全满足深亚微米 ASIC Sign-Off 的要求。VC…

C++模拟实现优先级队列(priority_queue)

目录 一、 仿函数 1.1仿函数的概念使用 1.2模拟实现仿函数 二、优先级队列&#xff08;priority_queue) 2.1 优先级队列概念 2.2 优先级队列使用 2.3 模拟实现优先级队列 2.3.1 优先级队列类框架 2.3.2 模板参数 2.3.3 构造函数 2.3.4 仿函数 2.3.5 adjust_up (堆向…

linux系统中QT里面信号与槽的实现方法

大家好&#xff0c;今天主要来聊一聊&#xff0c;QT中信号与槽的使用方法。 目录 第一&#xff1a;QT中信号与槽简介 第二&#xff1a;如何在项目里创建信号 第三&#xff1a;如何在项目中创建槽 第四&#xff1a;项目中连接信号与槽 第一&#xff1a;QT中信号与槽简介 在学…

遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)

遥感图像处理&#xff1a;最小噪声分离变换&#xff08;Minimum Noise Fraction Rotation&#xff0c;MNF Rotation1.PCA变换2.MNF3.PCA和MNF1.PCA变换 在统计学中&#xff0c;主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中…

Django使用Celery异步发送短信(Django4.1.3+Celery5.2.7+ubuntu)

首先要下载Celery&#xff0c;直接pip就好 我的redis配置 CACHES {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.2.128:6379/0","OPTIONS": {"CLIENT_CLASS"…

自动化测试Seleniums~2

webdriver API 1.如何打开网页以及如何关闭一个浏览器。 package test_20230107;import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver;import static java.lang.Thread.sleep;public class Test {public static void main(String[] args)…

JavaEE多线程-线程的状态和安全问题

目录一、线程中的基本状态二、线程安全问题三、线程安全的标准类四、synchronized 关键字-监视器锁monitor locksynchronized 的特性五、volatile 关键字一、线程中的基本状态 NEW: 安排了工作, 还未开始行动, 就是创建了Thread对象, 但还没有执行start方法(内核里面还没有创建…

SpringSecurity(十一)【跨域】

十一、跨域 简介 跨域问题实际应用开发中的一个非常常见的需求&#xff0c;在 Spring 框架中对于跨域问题的处理方案有好几种&#xff0c;引入了 Spring Security 之后&#xff0c;跨域问题的处理方案又增加了 什么是 CORS CORS&#xff08;Cross-Origin Resource-Sharing&…

联合证券|重磅数据出炉,道指飙涨700点!美股新年首周“开门红”!

美股涨嗨了&#xff01; 当地时间1月6日&#xff0c;最新发布的美国12月非农工作陈述显现&#xff0c;美国工作市场终于呈现降温迹象&#xff0c;过去一年的激进加息成效初显。受此提振&#xff0c;美股三大股指高开高走&#xff0c;彻底改变前几日的跌势。从周k线看&#xff…

PCB结构和谐振(三)

PCB结构和谐振&#xff08;一&#xff09;PCB结构和谐振&#xff08;二&#xff09;仿真研究在本节中&#xff0c;我们首先对玻璃束的随机分布进行了简单的模拟研究。然后我们利用这些实验结论来简化常用的玻璃布3D结构。最后&#xff0c;这种简化的结构用于研究复杂层压板和两…

Java设计模式中原型模式是啥/浅克隆与深克隆又是什么/clone方法怎么回事

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 4.5 原型模式 4.5.1 概述 用已创建实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象一样的新对象 4.5.2 结构 抽象原型类&#xff1a;规定具体…

Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客https://blognas.hwb0307.com&#xff0c;该文的内容更新仅在个人博客可见。欢迎关注&#xff01; 前言 基于《Docker系列 搭建个人云盘服务nextcloud》&#xff0c;相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是&#xff0c;Ne…

02、做点准备工作 osg\openscenegraph源代码下载 C++三维视频融合实战系列(时空克隆)

首先&#xff0c;要有一点C编程基础&#xff0c;熟悉VS2013开发环境。 在开始实践之前&#xff0c;先要搭建号VS2013开发环境。 然后&#xff0c;建议电脑安装windows 10 64位操作系统。 接下来需要在以下地址下载开源代码&#xff1a; 1、osg下载 打开openscenegraph主页…

CSS权威指南(七)视觉格式化

文章目录1.盒模型2.元素的显示方式3.行内元素1.盒模型 不管是什么元素,CSS都假定每个元素会生成一个或多个矩形框,我们称之为元素。各元素框的中心是内容区域&#xff0c;四周有可选的内边距、边框、轮廓和外边距。默认情况下&#xff0c;内容区的背景出现在内边距范围内。外边…

5分钟搞懂用户态,内核态

5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间&#xff0c;为了使应用程序访问到内核管理的资源例如CPU&#xff0c;内存&#xff0c;I/O。内核必须提供一组通用的访问接口&#xff0c;这些接口就叫系统调用。 用户态&#xff0c;内核态…

进制详解:二进制、八进制和十六进制

进制详解&#xff1a;二进制、八进制和十六进制 背景&#xff08;Contexts&#xff09; 我们平时使用的数字都是由 0~9 共十个数字组成的&#xff0c;例如 1、9、10、297、952 等&#xff0c;一个数字最多能表示九&#xff0c;如果要表示十、十一、二十九、一百等&#xff0c;…

机器学习笔记之深度信念网络(一)背景介绍与模型表示

机器学习笔记之深度信念网络——背景介绍与模型表示引言深度信念网络场景构建深度信念网络的联合概率分布引言 从本节开始&#xff0c;将介绍深度信念网络。 深度信念网络 深度信念网络(Deep Belief Network,DBN)是杰弗里辛顿(Geoffrey Hinton)于2006年提出的模型&#xff0…

Day853.WorkerThread模式 -Java 性能调优实战

WorkerThread模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于WorkerThread模式的内容。 Thread-Per-Message 模式&#xff0c;对应到现实世界&#xff0c;其实就是委托代办。这种分工模式如果用 Java Thread 实现&#xff0c;频繁地创建、销毁线程非常影响性能…

场景编程集锦 - 吉米的总统梦想

1. 场景描述 吉米是太平洋岛国一个贫苦家庭的孩子&#xff0c;他的梦想就是当总统&#xff0c;引领国家走向富强之路。 开学的第一堂课上&#xff0c;老师用白色的粉笔在黑板上写下了“我的梦想”&#xff0c;同学们都陷入了思考。大卫的梦想是当一名科学家&#xff0c;用奇思妙…

CSS初级教程(文本)【第六天】

文章目录【1】CSS 文本[字体颜色|背景色]【2】CSS 文本对齐【3】CSS 文字装饰【4】CSS 文本转换[大写或小写]【5】CSS 文字间距【6】CSS 文本阴影【7】所有 CSS 文本属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CS…