请解释 Node.js 中的网络模块(http、https),如何创建 HTTP服务器?
1. Node.js 中的网络模块(http 和 https)
原理与作用:
-
Node.js 的
http和https模块是内置的核心模块,用于创建 HTTP 和 HTTPS 服务器。 -
http模块基于 Node.js 的事件驱动架构,利用libuv和HTTP parser库高效处理 HTTP 请求和响应。 -
https模块在http模块的基础上增加了 SSL/TLS 加密功能,用于创建安全的 HTTPS 服务器。
2. 如何创建 HTTP 服务器
基础示例
以下是使用 http 模块创建一个简单 HTTP 服务器的代码示例:
// 引入 http 模块
const http = require('http');// 创建服务器
const server = http.createServer((req, res) => {// 设置响应头,指定编码为 UTF-8res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });// 返回响应内容res.end('欢迎访问我的 Node.js HTTP 服务器!');
});// 监听端口
const port = 3000;
server.listen(port, () => {console.log(`服务器已启动,正在监听 http://localhost:${port}`);
});
代码解析
-
http.createServer():-
创建一个 HTTP 服务器实例,接受一个回调函数作为参数。
-
回调函数会在每次 HTTP 请求到达时触发,传入
req(请求对象)和res(响应对象)。
-
-
req和res:-
req对象包含与传入请求相关的信息(如 URL、HTTP 方法、Headers)。 -
res对象用于设置响应状态、发送响应数据。
-
-
server.listen():-
将服务器绑定到指定的端口和 IP 地址(默认是
localhost或127.0.0.1)。
-
高级示例:支持路由和参数
const http = require('http');const server = http.createServer((req, res) => {// 解析请求路径const url = req.url;console.log(`请求路径:${url}`);if (url === '/') {// 主页res.writeHead(200, { 'Content-Type': 'text/html' });res.end('<h1>首页</h1><p>欢迎访问首页!</p>');} else if (url === '/about') {// 关于页面res.writeHead(200, { 'Content-Type': 'text/html' });res.end('<h1>关于我</h1><p>这里是关于我的页面。</p>');} else {// 未找到页面res.writeHead(404, { 'Content-Type': 'text/html' });res.end('<h1>404 - 页面未找到</h1>');}
});server.listen(3000, () => {console.log('服务器已启动,访问 http://localhost:3000');
});
3. 合理化的使用建议
使用模块化开发
-
将路由、中间件、业务逻辑拆分到不同模块中。
-
示例:
// routes.js module.exports = {home: (req, res) => res.end('首页内容'),about: (req, res) => res.end('关于页面内容') };// server.js const http = require('http'); const routes = require('./routes');const server = http.createServer((req, res) => {switch (req.url) {case '/':routes.home(req, res);break;case '/about':routes.about(req, res);break;default:res.writeHead(404);res.end('未找到页面');} });server.listen(3000);
使用中间件
-
中间件用于在请求处理过程中添加通用逻辑(如日志记录、身份验证)。
-
示例:
const logRequest = (req, res, next) => {console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);next(); // 调用下一个中间件或路由处理器 };const server = http.createServer((req, res) => {logRequest(req, res, () => {// 处理请求逻辑res.end('Hello Middleware!');}); });
使用模板引擎(可选)
-
如
EJS或Pug,用于动态生成 HTML 内容。 -
示例(使用 EJS):
const ejs = require('ejs'); const fs = require('fs');const server = http.createServer(async (req, res) => {const template = await fs.promises.readFile('./template.ejs', 'utf8');const html = ejs.render(template, { name: 'Alice' });res.writeHead(200, { 'Content-Type': 'text/html' });res.end(html); });
4. 实际开发中需要注意的点
错误处理
-
始终处理所有可能的错误(如文件读取失败、数据库查询失败)。
-
示例:
fs.readFile('non-existent-file.txt', (err, data) => {if (err) {res.writeHead(500);res.end('文件读取失败');return;}res.end(data); });
性能优化
-
使用
gzip压缩响应数据,减少传输时间。const zlib = require('zlib'); res.writeHead(200, {'Content-Type': 'text/html','Content-Encoding': 'gzip' }); zlib.gzip('<h1>Compressed page</h1>', (err, gzipData) => {res.end(gzipData); });
安全性
-
使用 HTTPS
const https = require('https'); const fs = require('fs');const options = {key: fs.readFileSync('server.key'),cert: fs.readFileSync('server.cert') };https.createServer(options, (req, res) => {res.end('安全的 HTTPS 服务器'); }).listen(443); -
防止 XSS 和 CSRF 攻击:
-
对用户输入进行验证和过滤。
-
使用安全的头信息(如
Content-Security-Policy)。
-
关闭服务器
-
优雅关闭服务器,确保所有请求处理完成后再退出。
const gracefulShutdown = () => {server.close(() => {console.log('服务器已关闭');process.exit(0);});setTimeout(() => {console.error('强制关闭服务器');process.exit(1);}, 3000); };process.on('SIGTERM', gracefulShutdown);
5. 总结
-
http和https模块是构建 Node.js 服务的基础,灵活运用它们可以创建功能强大的 HTTP/HTTPS 服务器。 -
开发建议包括模块化、中间件、模板引擎以及安全性、性能优化等。
-
实际开发中要特别注意错误处理、安全性以及优雅关闭服务器等细节。
相关文章:
请解释 Node.js 中的网络模块(http、https),如何创建 HTTP服务器?
1. Node.js 中的网络模块(http 和 https) 原理与作用: Node.js 的 http 和 https 模块是内置的核心模块,用于创建 HTTP 和 HTTPS 服务器。 http 模块基于 Node.js 的事件驱动架构,利用 libuv 和 HTTP parser 库高效处…...
【WPF命令绑定之--没有Command属性的控件如何进行命令绑定?】
前言 C#WPF之命令绑定 内容 有些控件不支持直接绑定命令,可以调用其他依赖实现命令的绑定。 依赖:Microsoft.Xaml.Behaviors.Wpf 使用如下代码可以实现事件的命令绑定,及传递参数: 1、引用:xmlns:behavior“http://sch…...
记20忘10之六:line
记20忘10之六:line 胖子定律:每天坚持多咬两口,相信将来自己就是个胖子 今天,我们继续来记几个单词吧, line n.线 moral bottom line道德底线 派生、同源或相关: linear a.线的,直线的lineamen…...
【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
【系统稳定性】1.11 QVM稳定性问题分析(一)
目录 写在前面 一,qvm进程异常 1.1 进程崩溃(Coredump) 1.2 进程卡死 1.3 进程重启 二,qvm进程异常分析过程 写在前面 在QVM(Quantum Virtual Machine)作为HOST QNX的Guest,同样会遇到重启、Watchdog(看门狗)等稳定性问题。 这里我们把qvm的异常归类为两类问题…...
使用ChatGPT-Deep Reaserch两步给出文献综述!
文献综述是学术论文写作中不可或缺的一部分,它不仅是对已有研究的梳理和总结,更是为后续研究奠定理论基础的关键步骤。通过文献综述研究者能够全面了解当前研究领域的现状、主要观点和研究方法,从而找到自己研究的切入点和创新点。这一过程需…...
从0开始的操作系统手搓教程14——进一步完成中断子系统
目录 所以,如何查看我们的IDT呢 改进我们的中断处理hook 对8253编程,提升系统的频率 导论 控制字说明 说一下每个方式——概论 说一说计数器如何进行计时 方式0 方式1 方式2 方式3 方式4 方式5 回到问题,我们如何设置单次触发冲…...
小米火龙CPU和其他几代温度太高的CPU是由谁代工的
小米火龙CPU”并非小米自研芯片,而是指搭载在小米手机上的部分高通骁龙处理器因发热问题被调侃为“火龙”。以下是几款被称为“火龙”的高通CPU及其代工情况: 骁龙810 骁龙810是高通历史上最著名的“火龙”之一,采用台积电20nm工艺代工。由于…...
Educational Codeforces Round 174 (Rated for Div. 2)
Problem - B - Codeforces 之前没思路,我看了看答案。 思路不就来了: 简而言之,BFS那样遍历周围(上下左右均一次),如果有同色,就把这部分相邻的隔开,可以得到两块陌生人集合&#x…...
微服务即时通信系统---(七)文件管理子服务
目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 服务代码实现 封装文件操作模块(utils.hpp) 获取唯一标识ID 文件读操作 文件写操作 编写proto文件 文件元信息 文件管理proto 单文件上传 多文件上传 单文件下载 多文件下载 RPC调用 服务端创建子…...
mosfet的驱动设计-开关损耗
目录 1.开关时的DS损耗 2.导通损耗 3.截止损耗 4.驱动损耗 mos管的损耗主要有开关损耗和导通损耗两部分,开关损耗包括mos管开通是消耗的能量和在mos在线性区产生的损耗。导通损耗是由mos的导通电阻电阻消耗的能量。 mos的实际模型 我们先来感性的…...
Unity3D 对象实例化详解
前言 在Unity3D中,对象的实例化是游戏开发中非常常见的操作。无论是生成敌人、道具,还是动态创建UI元素,实例化都是实现这些功能的核心技术之一。本文将详细介绍Unity3D中对象实例化的原理、技术细节以及代码实现。 对惹,这里有…...
萌新学 Python 之 with 文件操作语句
with 语句用于资源管理,避免资源泄露,对文件操作时,不管文件是否有异常,都会自动清理和关闭 with 语句的格式: with open(文件路径, mode模式, encodingutf-8) as file_obj: # as 取别名print(对文件进行操作&…...
C# Unity 唐老狮 No.2 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…...
FFmpeg-chapter3-读取视频流(原理篇)
ffmpeg网站:About FFmpeg 1 库介绍 (1)libavutil是一个包含简化编程函数的库,包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 (2)libavcodec是一个包含音频/视频编解码器的解码器和编…...
Docker迁移/var/lib/docker之后镜像容器丢失问题
迁移/var/lib/docker时,如果目标目录少写一个/,/etc/docker/daemon.json中的data-root后面需要多加一级目录docker。 若迁移命令如下 rsync -avz /var/lib/docker /home/docker/ 在/etc/docker/daemon.json中添加如下内容 "data-root": &q…...
单片机中的flah和RAM
片机的 Flash 和 RAM 是两种关键的内存类型,分别用于存储程序代码和运行时数据。 Flash 存储器 用途:用于存储程序代码(如固件)和常量数据(如查找表、字符串等)。 特点: 非易失性:断…...
【Pytest】setup和teardown的四个级别
文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中,setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…...
第8天:面向对象编程入门 - 类与对象
第8天:面向对象编程入门 - 类与对象 一、📚 今日学习目标 🎯 掌握类与对象的定义与使用🔧 理解封装、继承、多态三大特性💡 完成银行账户管理系统实战🛠️ 学会构造函数与析构函数的编写 二、⚙️ 核心知…...
单细胞marker基因表达密度图-(还有一个包装函数)
有小伙伴说想要做单细胞marker基因表达密度图,我一想,好像之前是做过的(单细胞marker基因可视化的补充---密度图与等高线图)。但是他又说没有文献中的效果。后来我一看,是因为着色的问题。其实用Nebulosa包(…...
python多线程之Event机制笔记
Event 事件 笔记 1. 基本概念 threading.Event 是 Python 线程同步的基础组件,本质是一个布尔标志位,提供跨线程的事件通知机制。 2. 核心方法 方法作用描述set()设置事件为 True,唤醒所有等待线程clear()重置事件为 Falsewait(timeoutNo…...
记忆化搜索与动态规划:原理、实现与比较
记忆化搜索和动态规划是解决优化问题的两种重要方法,尤其在处理具有重叠子问题和最优子结构性质的问题时非常有效。 目录 1. 记忆化搜索(Memoization) 定义: 实现步骤: 示例代码(斐波那契数列࿰…...
架构师面试(九):缓存一致性
问题 关于【数据库和缓存】一致性,下面哪几项是在线上生产环境中相对合理的处理方式? A. 对于查询操作,先查缓存,如果为空则查 DB,然后将数据带入缓存; B. 对于插入操作,只写 DB 即可&#…...
Spring Boot集成Spring Ai框架【详解 搭建Spring Ai项目,以及简单的ai大模型智能体应用,附有图文+示例代码】
文章目录 一.Spring Ai介绍1.0 认识Spring Ai1.1 特征1.1 大模型专业名字介绍1.1.1 RAG(检索增强生成)RAG 的基本原理RAG 的关键技术RAG 的优势RAG 的应用场景 1.1.2 fine-tuning(微调)1.1.3 function-call(函数调用) 1.2 创建简单的Spring Ai项目 二.Spring Ai简单的智能应用2…...
OpenHarmony启动系统-U-Boot简介和源码下载与编译
OpenHarmony系统启动流程简述 设备上电后,OpenHarmony系统大致经历以下3个阶段: 1.BootRom代码引导加载UBoot; 2.UBoot启动初始化硬件资源,引导并加载系统内核(Linux内核); 3.Kernel(LiteOs,Linux内核)启动、加载驱动…...
Metal 学习笔记六:坐标空间
要在网格上轻松找到一个点,您需要一个坐标系。例如,如果网格恰好是您的 iPhone 15 屏幕,则中心点可能是 x:197、y:426。但是,该点可能会有所不同,具体取决于它所处的空间。 在上一章中…...
React + TypeScript 实现 SQL 脚本生成全栈实践
React TypeScript 实现数据模型驱动 SQL 脚本生成全栈实践 引言:数据模型与 SQL 的桥梁革命 在现代化全栈开发中,数据模型与数据库的精准映射已成为提升开发效率的关键。传统手动编写 SQL 脚本的方式存在模式漂移风险高(Schema Drift&#…...
执行git操作时报错:`remote: [session-b8xxxda3] Access denied ...`解决方案
问题描述: 执行git push -u origin "master"时报错: > remote: [session-b849cda3] Access denied > fatal: unable to access https://gitee.com/jyunee/maibobo.git/: The requested URL returned error: 403表示没有权限访问远程仓库…...
brew search报错,xcrun:error:invalid active developer path CommandLineTools
问题出现的原因 出现“xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun”错误,通常是因为Xcode命令行工具未正确安装或其路径已损坏。以下是几种常见的…...
Java测试框架Mockito快速入门
Mockito结合TestNG快速入门 什么是Mockito Mockito 是一个专门用于 Java 的强大测试框架,主要用来创建和管理模拟对象,辅助开发者进行单元测试,具有以下特点和功能: 创建模拟对象:能通过简洁的语法创建类或接口的模…...
