node.js知识系列(4)-每天了解一点
目录
- 11. 异步文件操作
- 文件读取
- 文件写入
- 12. 包管理器(npm)
- 13. 子进程
- 14. 事件发射器(EventEmitter)
- 15. 异步编程和回调
- 16. Node.js 集成测试工具和框架
- 17. Express.js 中间件的 HTTP 请求流程
- 18. 文件上传和验证
- 19. Express.js 中的 WebSocket 支持
- 20. 身份验证和授权中间件
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
11. 异步文件操作
Node.js 提供了异步文件操作的 API,用于读取和写入文件。通常,您可以使用 fs
模块来执行这些操作。以下是一些基本的文件读取和写入示例:
文件读取
const fs = require('fs');fs.readFile('file.txt', 'utf8', (err, data) => {if (err) {console.error(err);return;}console.log(data); // 读取文件内容
});
文件写入
const fs = require('fs');const content = 'Hello, Node.js!';
fs.writeFile('file.txt', content, (err) => {if (err) {console.error(err);return;}console.log('文件已写入');
});
在上述示例中,文件读取和写入操作是异步执行的,当操作完成或出现错误时,回调函数会被调用。
12. 包管理器(npm)
Node.js 的包管理器(npm)是用于管理 JavaScript 包和依赖项的工具。它的主要功能和用途包括:
- 包安装和管理:npm 允许您轻松安装、更新和卸载 JavaScript 包。通过运行
npm install package-name
,您可以安装特定的包。 - 项目依赖管理:npm 允许您在项目中定义依赖项,将依赖信息记录在
package.json
文件中。这使得共享项目和管理依赖变得更加简单。 - 脚本执行:您可以在
package.json
文件中定义自定义脚本,以简化项目中的常见任务,如构建、测试和部署。 - 包发布:如果您编写了一个 JavaScript 包,npm 允许您将其发布到 npm 包仓库,以供其他开发者使用。
- 版本控制:npm 使用语义化版本控制,使得可以指定依赖项的版本范围,以确保项目的稳定性和兼容性。
13. 子进程
Node.js 的子进程是一个独立的进程,可以在您的应用程序中创建和管理它们。子进程通常用于执行外部命令、脚本或其他程序。
Node.js 提供了 child_process
模块,用于创建和与子进程进行通信。以下是创建子进程的基本示例:
const { spawn } = require('child_process');const child = spawn('ls', ['-l']); // 创建子进程运行 'ls -l' 命令child.stdout.on('data', (data) => {console.log(`子进程输出:${data}`);
});child.on('close', (code) => {console.log(`子进程退出,退出码 ${code}`);
});
在上述示例中,我们使用 spawn
方法创建了一个子进程来运行 ls -l
命令。子进程的输出和关闭事件都被监听,以便处理子进程的输出和退出。
14. 事件发射器(EventEmitter)
事件发射器是 Node.js 核心模块之一,用于实现事件驱动编程。它允许对象可以绑定自定义事件和触发这些事件。事件发射器在应用程序中的使用案例包括:
- 自定义事件:您可以创建自己的事件,以便在应用程序中响应特定的行为或状态变化。
- 回调函数注册:事件发射器允许将回调函数注册到事件上,并在事件触发时执行这些回调。
- 异步通信:它允许模块之间进行异步通信,使代码更加模块化和可维护。
以下是一个简单的事件发射器示例:
const EventEmitter = require('events');class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();myEmitter.on('event', () => {console.log('事件已触发');
});myEmitter.emit('event'); // 触发事件
在上述示例中,我们创建了一个自定义事件发射器 MyEmitter
,并定义了一个事件处理函数。然后,我们绑定事件处理函数到事件上,并使用 emit
方法触发事件。
15. 异步编程和回调
在 Node.js 中,异步编程是一种重要的编程模式,用于处理非阻塞操作,以提高应用程序的性能和响应速度。异步编程主要通过回调函数实现,回调函数将在操作完成后执行。
以下是一个简单的异步回调示例:
const fs = require('fs');fs.readFile('file.txt', 'utf8', (err, data) => {if (err) {console.error(err);return;}console.log(data); // 读取文件内容
});
在上述示例中,fs.readFile
是一个异步操作,当文件读取完成后,回调函数将被执行。这样可以避免阻塞应用程序,允许其他操作继续执行。
Node.js 还提供了其他异步编程模式,如 Promise 和 async/await,以更容易地处理异步操作和回调。
16. Node.js 集成测试工具和框架
在 Node.js 中进行集成测试时,有几个常见的工具和框架可供选择,以确保应用程序的各个部分协同工作并具备预期的功能。一些常见的工具和最佳实践包括:
- Mocha:Mocha 是一个流行的测试框架,它提供了强大的测试运行器和丰富的断言库。它支持异步测试和各种报告器。
- Chai:Chai 是一个断言库,与 Mocha 配合使用,使您可以编写可读性强的测试用例。
- Supertest:Supertest 是一个用于测试 HTTP 接口的库,可以轻松模拟 HTTP 请求并断言响应。
- Jest:Jest 是一个全功能的 JavaScript 测试框架,可用于编写单元测试和集成测试。它具有内置的断言库,支持异步测试和模拟功能。
- Cypress:Cypress 是一个端到端的测试框架,用于编写自动化的用户界面测试。它提供了一个实时预览功能,使测试编写和运行变得更加直观。
最佳实践包括编写独立的测试用例、模拟依赖项、在测试之前和之后执行清理操作,并定期运行测试套件以确保应用程序的稳定性。
17. Express.js 中间件的 HTTP 请求流程
Express.js 中的中间件处理 HTTP 请求流程遵循以下原则:
- 请求阶段:在请求进入 Express.js 应用程序时,会按照定义的顺序执行各个中间件。这些中间件可以执行请求预处理、身份验证、日志记录等操作。
- 路由匹配:当请求进入中间件链时,Express.js 会匹配请求的 URL 路径和 HTTP 方法与已定义的路由。匹配的路由处理函数将被执行。
- 路由处理:路由处理函数执行后,如果没有调用
next()
,请求处理流程将在此结束。如果调用了next()
,控制将传递给下一个中间件或路由处理函数。 - 错误处理:如果在路由处理或中间件中发生错误(通过
next(err)
抛出),错误处理中间件将捕获错误并执行相应的错误处理逻辑。 - 响应阶段:最终,响应被发送到客户端,可能经过多个中间件来进行最后的修改,例如设置响应头、发送数据等。
中间件的执行顺序取决于它们在应用程序中的定义顺序。通常,中间件链按照定义的顺序依次执行。但如果某个中间件未调用 next()
,则不会执行链中的后续中间件。
18. 文件上传和验证
在 Express.js 中处理文件上传并验证文件类型和大小通常需要使用第三方中间件,如 multer
。以下是一个简单的示例,演示如何处理文件上传并验证文件类型和大小:
const express = require('express');
const multer = require('multer');
const app = express();// 配置文件上传
const storage = multer.diskStorage({destination: (req, file, cb) => {cb(null, 'uploads/');},filename: (req, file, cb) => {cb(null, file.originalname);},
});const fileFilter = (req, file, cb) => {if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {cb(null, true); // 允许上传} else {cb(new Error('只允许上传 JPEG 和 PNG 格式的图片'), false); // 拒绝上传}
};const upload = multer({storage,fileFilter,limits: {fileSize: 1024 * 1024, // 限制文件大小为 1MB},
});// 处理文件上传
app.post('/upload', upload.single('file'), (req, res) => {res.send('文件上传成功');
});app.listen(3000, () => {console.log('服务器正在监听端口 3000');
});
上述示例中,使用 multer
中间件配置了文件上传,并添加了文件类型验证、文件大小限制等功能。上传的文件将被保存到指定的目录。
19. Express.js 中的 WebSocket 支持
Express.js 本身不提供原生的 WebSocket 支持,但可以集成 WebSocket 库,例如 socket.io
,以实现 WebSocket 功能。
以下是一个简单的 Express.js 与 socket.io
集成的 WebSocket 示例:
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');const app = express();
const server = http.createServer(app);
const io = socketIo(server);io.on('connection', (socket) => {console.log('用户已连接');socket.on('chat message', (msg) => {io.emit('chat message', msg); // 广播消息给所有客户端});socket.on('disconnect', () => {console.log('用户已断开连接');});
});app.get('/', (req, res) => {res.sendFile(__dirname + '/index.html');
});server.listen(3000, () => {console.log('服务器正在监听端口 3000');
});
在上述示例中,使用 Express.js 创建 HTTP 服务器,并集成 socket.io
来处理 WebSocket 连接。客户端可以通过 WebSocket 发送和接收消息。
20. 身份验证和授权中间件
Express.js 中有许多身份验证和授权中间件可供选择。其中一些常见的包括 Passport.js、jsonwebtoken、和 express-jwt。
- Passport.js:是一个灵活且广泛使用的身份验证中间件,支持
多种身份验证策略(例如本地策略、OAuth、OpenID 等)。
- jsonwebtoken:是一个用于生成和验证 JSON Web Tokens(JWT)的库,可用于实现基于令牌的身份验证和授权。
- express-jwt:是一个 Express.js 中间件,用于验证 JWT 令牌。它可以轻松集成到 Express.js 应用程序中,以保护特定的路由或资源。
身份验证中间件通常用于验证用户的身份,而授权中间件用于控制用户对资源的访问权限。这些中间件可以根据需求进行配置,以满足应用程序的安全性需求。
相关文章:
node.js知识系列(4)-每天了解一点
目录 11. 异步文件操作文件读取文件写入 12. 包管理器(npm)13. 子进程14. 事件发射器(EventEmitter)15. 异步编程和回调16. Node.js 集成测试工具和框架17. Express.js 中间件的 HTTP 请求流程18. 文件上传和验证19. Express.js 中…...

can not remove .unionfs
文件夹下出现unionfs 套娃,无法删除。 处理方式: 需要管理员权限umount之后删除使用fusermount -zu .unionfs ,然后再删除。...

微服务 BFF 架构设计
在现代软件开发中,由于程序、团队、数据规模太大,需要把企业的业务能力进行复用,将领域服务剥离,提供通用能力,避免重复建设和代码;另外服务功能的弹性能力不一样,比如定时任务、数据同步明确的…...
零基础学python之元组
文章目录 元组1、元组的应用场景2、定义元组3、元组的常见操作4、总结 元组 目标 元组的应用场景定义元组元组常见操作 1、元组的应用场景 思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做? 答:列…...

11. SpringBoot项目中参数获取与响应
SpringBoot项目中参数获取与响应 1. 程序结构&通信方式 程序结构: C/S : 客户端/服务器端 -Main方法。 -效果炫目、数据相对安全。 -公司成本高,因为要分别开发客户端和服务器端。 B/S: 浏览器端/服务器端 -效果依赖于浏览…...

4+1视图与UML
目录 逻辑视图过程视图开发视图物理视图(部署视图)用例视图 41视图,即逻辑视图,过程视图,实现视图,部署视图,用例视图。 为什么不用一个视图? 针对多个用户,即终端用户&a…...

没用的知识增加了,尝试用文心实现褒义词贬义词快速分类
尝试用文心实现褒义词贬义词快速分类 一、我的需求二、项目环境搭建千帆SDK安装及使用流程 三、项目实现过程创建应用获取签名调用接口计算向量积总结 百度世界大会将于10月17日在北京首钢园举办,今天进入倒计时五天了。通过官方渠道的信息了解到,这次是…...

AWS SAP-C02教程3--网络资源
架构设计中网络也是少不了的一个环节,而AWS有自身的网络结构和网络产品。本章中将带你看看AWS中不同网络产品,以及计算资源、存储资源等产品在网络架构中处于哪个位置,如何才能让它们与互联网互通、与其它产品互通。下图视图将SAP涉及到网络相关组件在一张图表示出来,图中可…...

【TensorFlow2 之012】TF2.0 中的 TF 迁移学习
#012 TensorFlow 2.0 中的 TF 迁移学习 一、说明 在这篇文章中,我们将展示如何在不从头开始构建计算机视觉模型的情况下构建它。迁移学习背后的想法是,在大型数据集上训练的神经网络可以将其知识应用于以前从未见过的数据集。也就是说,为什么…...

mysql面试题46:MySQL中datetime和timestamp的区别
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL中DATETIME和TIMESTAMP的区别 在MySQL中,DATETIME和TIMESTAMP是两种用于存储日期和时间的数据类型。虽然它们都可以用于存储日期和时间信息…...

【Spring Boot】RabbitMQ消息队列 — RabbitMQ入门
💠一名热衷于分享知识的程序员 💠乐于在CSDN上与广大开发者交流学习。 💠希望通过每一次学习,让更多读者了解我 💠也希望能结识更多志同道合的朋友。 💠将继续努力,不断提升自己的专业技能,创造更多价值。🌿欢迎来到@"衍生星球"的CSDN博文🌿 🍁本…...

Navicat定时任务
Navicat定时任务 1、启动Navicat for MySQL工具,连接数据库。 2、查询定时任务选项是否开启 查询命令:SHOW VARIABLES LIKE ‘%event_scheduler%’; ON表示打开,OFF表示关闭。 打开定时任务命令 SET GLOBAL event_scheduler 0; 或者 SET G…...

小白必备:简单几步, 使用Cpolar+Emlog在Ubuntu上搭建个人博客网站
文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...
封装 Token
什么是token? 作为计算机术语,是“令牌”的意思 。 Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请…...
CloudCompare 二次开发(17)——点云添加均匀分布的随机噪声
目录 一、概述二、代码集成三、结果展示一、概述 不依赖任何第三方点云相关库,使用CloudCompare编程实现点云添加随机噪声。添加随机噪声的算法原理见:PCL 点云添加均匀分布的随机噪声。 二、代码集成 1、mainwindow.h文件public中添加: void doActionAddRandomNoise(); …...

研发必会-异步编程利器之CompletableFuture(含源码 中)
近期热推文章: 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、基于Redis的Geo实现附近商铺搜索(含源码) 4、基于Redis实现关注、取关、共同关注及消息推送(含源码) 5…...

上海亚商投顾:沪指高开高走 锂电等新能源赛道大反攻
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日高开后强势震荡,创业板指盘中一度翻绿,随后探底回升再度走高。碳酸锂期货合约…...

力扣第235题 二又搜索树的最近公共祖先 c++
题目 235. 二叉搜索树的最近公共祖先 中等 (简单) 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q&…...

时代风口中的Web3.0基建平台,重新定义Web3.0!
近年来,Web3.0概念的广泛兴起,给加密行业带来了崭新的叙事方式,同时也为加密行业提供了更加具有想象力的应用场景与商业空间,并让越来越多的行业从业者们意识到只有更大众化的市场共性需求才能推动加密市场的持续繁荣。当前围绕这…...

React学习笔记 001
什么是React 1.发送请求获取数据 处理数据(过滤、整理格式等) 3.操作DOM呈现页面 react 主要是负责第三部 操作dom 处理页面 数据渲染为HTML视图的开源js库。 好处 避免dom繁琐 组件化 提升复用率 特点 声明式编程: 简单 组件化编程…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...