当前位置: 首页 > news >正文

node.js知识系列(5)-每天了解一点

目录

    • 21. RESTful API 设计中的 HTTP 动词
    • 22. 中间件链和回调地狱
    • 23. Express.js 的 ORM 经验
    • 24. 错误处理中间件和 HTTP 状态码
    • 25. 事件循环(Event Loop)在异步编程中的作用
    • 26. Node.js 缓存机制
    • 27. Node.js 全局对象
    • 28. 性能分析和调优经验
    • 29. Express.js中的中间件执行顺序和控制
    • 30. Express.js的扩展性


👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


21. RESTful API 设计中的 HTTP 动词

在 Express.js 中设计和实现 RESTful API 时,HTTP 动词(GET、POST、PUT、DELETE 等)对资源的操作非常重要。以下是如何定义和使用 HTTP 动词的示例:

  • GET:用于从服务器获取资源的信息。例如,GET /api/users 可以获取所有用户的列表,而 GET /api/users/:id 可以获取特定用户的详细信息。
  • POST:用于在服务器上创建新资源。例如,POST /api/users 可以创建新用户。
  • PUT:用于更新服务器上的资源。例如,PUT /api/users/:id 可以更新特定用户的信息。
  • DELETE:用于删除服务器上的资源。例如,DELETE /api/users/:id 可以删除特定用户。
  • 其他自定义动词:根据需要,您还可以定义其他自定义的 HTTP 动词来执行特定操作,例如 PATCH 用于部分更新资源。

RESTful API 还应该使用状态码来指示请求的结果,例如 200 OK 表示成功,201 Created 表示成功创建资源,404 Not Found 表示资源不存在,等等。

22. 中间件链和回调地狱

Express.js 中间件链是按照定义顺序执行的,每个中间件函数都可以选择是否调用 next() 来将控制传递给下一个中间件或路由处理函数。这种机制可以避免回调地狱,使代码更加清晰和可维护。

为了避免回调地狱,您可以采用以下最佳实践:

  • 使用异步/await:如果您的中间件或路由处理函数执行异步操作,可以使用异步/await 来提高可读性和可维护性。
  • 拆分中间件:将大的中间件函数拆分成小的、可重用的中间件函数,以便于组合和管理。
  • 错误处理中间件:使用错误处理中间件来集中处理错误,以便在中间件链中不必多次处理错误。
  • Promise 链:将多个异步操作组合成 Promise 链,以确保它们按照期望的顺序执行。

这些最佳实践可以帮助您编写清晰、可维护且不陷入回调地狱的 Express.js 应用程序。

23. Express.js 的 ORM 经验

是的,我有使用 Express.js 的 ORM(Object-Relational Mapping)库的经验。其中一些常见的 Express.js ORM 包括 Sequelize 和 Mongoose。

  • Sequelize:Sequelize 是一个支持多种数据库的 ORM,例如 PostgreSQL、MySQL 和 SQLite。我使用 Sequelize 来定义数据模型、执行查询、创建和迁移数据库表等。它提供了强大的查询语言和事务支持。
  • Mongoose:Mongoose 是 MongoDB 的官方 ODM(Object Data Modeling)库。我使用 Mongoose 来定义数据模型和模式,并执行 MongoDB 数据库的 CRUD 操作。它还支持中间件和查询构建器。

ORM 允许我使用 JavaScript 对象来表示数据库中的数据,而不需要直接编写 SQL 或 MongoDB 查询。这提高了开发效率,并使数据模型更易于维护。

24. 错误处理中间件和 HTTP 状态码

Express.js 中的错误处理中间件用于捕获应用程序中的错误,并向客户端返回适当的 HTTP 错误状态码。以下是一个简单的错误处理中间件示例:

app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('服务器发生了错误');
});

在上述示例中,如果在中间件链的某个地方发生了错误,它将被捕获并由错误处理中间件处理。错误处理中间件使用 res.status() 来设置响应的 HTTP 状态码,并向客户端发送错误消息。

通常,HTTP 状态码用于指示请求的结果,例如 404 Not Found 表示资源不存在,500 Internal Server Error 表示服务器发生了错误。错误处理中间件可以根据错误类型和应用程序需求设置适当的状态码。

25. 事件循环(Event Loop)在异步编程中的作用

事件循环(Event Loop)是 Node.js 异步编程的核心。它是一个持续运行的循环,用于处理异步操作、事件和回调函数。

事件循环的主要作用包括:

  • 异步操作处理:事件循环允许 Node.js 处理非阻塞的 I/O 操作,以确保应用程序不会在等待 I/O 完成时被阻塞。
  • 事件驱动编程:Node.js 应用程序基于事件驱动编程模型,事件循环用于监听和分发事件,如 HTTP 请求、文件读取完成等。
  • *回调函数

执行**:当异步操作完成时,事件循环将调用注册的回调函数,以处理操作的结果。

事件循环的机制使得 Node.js 能够高效地处理大量并发请求,同时保持低资源占用。这使得 Node.js 成为构建高性能、可伸缩的网络应用程序的理想选择。

26. Node.js 缓存机制

Node.js 提供了内置的缓存机制,可用于缓存数据以提高性能。以下是一些常见的 Node.js 缓存机制:

  • 内存缓存:通过将数据存储在内存中,可以快速访问和检索数据。Node.js 的 Cache 对象或 Map 数据结构可用于实现内存缓存。
  • 文件缓存:将数据存储在文件中,以便在需要时进行读取。Node.js 的 fs 模块可用于文件缓存。
  • 第三方缓存库:使用第三方缓存库,如 Redis 或 Memcached,来存储和管理缓存数据。这些库提供了高效的键值存储和过期处理。

在使用缓存时,需要考虑缓存的有效期、缓存清理策略以及缓存与数据同步的问题。合理使用缓存可以显著提高应用程序的性能。

27. Node.js 全局对象

Node.js 中有一些全局对象,它们在整个应用程序中都可以访问。一些常见的全局对象包括:

  • global:全局对象,可以在应用程序的任何地方访问。不建议在生产代码中滥用它,因为它可能导致命名冲突和不可维护的代码。
  • process:代表 Node.js 进程的对象,它提供了许多与进程相关的信息和控制方法。
  • console:用于打印日志和调试信息的对象。
  • Buffer:用于处理二进制数据的对象,通常用于文件操作和网络通信。

这些全局对象可以在 Node.js 应用程序的各个部分使用,但建议谨慎使用全局对象,以避免潜在的问题。

28. 性能分析和调优经验

在 Node.js 应用程序中进行性能分析和调优是关键的,以下是一些经验和技巧:

  • 使用性能分析工具:使用工具如 Node.js Profiler 或 Clinic.js 来分析应用程序的性能瓶颈和内存泄漏。
  • 监视事件循环:了解事件循环的状态,检查是否有未处理的异步操作,以及是否需要调整事件循环的参数。
  • 代码优化:查找并优化性能较差的代码段,使用高效的算法和数据结构,避免同步操作和阻塞代码。
  • 缓存和资源复用:合理使用缓存机制,减少不必要的重复计算,复用资源以减少开销。
  • 负载均衡:将请求分发到多个 Node.js 实例以提高并发处理能力,使用反向代理工具如 Nginx 进行负载均衡。
  • 数据库优化:优化数据库查询,使用索引和查询优化器来提高数据库性能。
  • 监控和日志:使用监控工具和日志记录来实时跟踪应用程序的行为,以便及时发现和解决问题。
  • 合理使用异步:使用异步编程模型来处理 I/O 操作,避免阻塞操作。

这些经验和技巧有助于提高 Node.js 应用程序的性能和可伸缩性,使其能够处理更多的并发请求。

29. Express.js中的中间件执行顺序和控制

在Express.js中,中间件的执行顺序非常重要,因为它可以影响请求的处理和响应。中间件按照定义的顺序执行,通常在应用程序的入口处从上到下依次执行。以下是一些关于中间件执行顺序和如何控制它的关键概念:

  • 顺序执行: 在Express.js中,中间件按照它们在代码中的添加顺序执行。第一个添加的中间件将首先执行,然后是第二个,以此类推。

  • next函数: 中间件函数通常接受一个名为next的参数。通过调用next,你可以将控制权传递给下一个中间件。如果不调用next,中间件链可能会中断,请求将不会继续传递给后续中间件。

  • 异步中间件: 如果中间件是异步的(例如,涉及数据库查询或远程API调用),你需要确保在异步操作完成后调用next,否则请求可能会被挂起。

  • 控制中间件执行顺序: 你可以通过适当的添加和排序中间件来控制它们的执行顺序。如果你需要在某些路由上使用特定的中间件,只需在该路由之前添加这些中间件。

示例:

const express = require('express');
const app = express();// 优先执行的中间件
app.use((req, res, next) => {console.log('Middleware 1');next();
});// 其他路由
app.get('/', (req, res) => {res.send('Hello, World!');
});// 较晚执行的中间件
app.use((req, res, next) => {console.log('Middleware 2');next();
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

在上面的示例中,"Middleware 1"会在"Hello, World!"响应之前打印,因为它是在app.get之前定义的。

30. Express.js的扩展性

Express.js是一个高度可扩展的框架,允许你通过添加自定义中间件和路由来扩展应用程序的功能。以下是一些关于Express.js的扩展性的关键概念:

  • 自定义中间件: 你可以编写自定义中间件函数,以实现应用程序的特定功能。这些中间件函数可以处理请求、添加响应头、进行身份验证、记录请求日志等等。通过使用app.useapp.METHOD(如app.getapp.post)来将自定义中间件添加到应用程序。

  • 自定义路由: 你可以定义自定义路由以处理特定的URL路径。使用app.METHOD,你可以将处理程序函数绑定到特定HTTP方法(GET、POST、PUT、DELETE等)。这使你能够为不同的路由路径定义不同的行为。

  • 模块化: Express.js应用程序通常可以拆分为多个模块和路由文件,这样可以更好地组织代码并提高可维护性。使用express.Router对象创建路由模块,然后将它们与应用程序中的主应用程序连接起来。

  • 使用第三方中间件: 你可以使用第三方中间件(例如身份验证中间件、日志中间件、CORS中间件等)来扩展应用程序的功能。这些中间件通常是社区或开发者共享的,可以通过npm安装并添加到应用程序中。

示例:

const express = require('express');
const app = express();// 自定义中间件
app.use((req, res, next) => {console.log('Custom Middleware');next();
});// 自定义路由
app.get('/', (req, res) => {res.send('Hello, World!');
});// 使用自定义路由模块
const otherRouter = require('./otherRouter');
app.use('/other', otherRouter);app.listen(3000, () => {console.log('Server is running on port 3000');
});

在上面的示例中,自定义中间件和路由都被用来扩展Express.js应用程序的功能。你可以将自定义中间件和路由组合起来,以实现特定的应用程序需求。

相关文章:

node.js知识系列(5)-每天了解一点

目录 21. RESTful API 设计中的 HTTP 动词22. 中间件链和回调地狱23. Express.js 的 ORM 经验24. 错误处理中间件和 HTTP 状态码25. 事件循环(Event Loop)在异步编程中的作用26. Node.js 缓存机制27. Node.js 全局对象28. 性能分析和调优经验29. Express…...

Linux服务器(银河麒麟、CentOS 7+、CentOS 7+ 等)修改IP地址

打开终端或控制台,以root或具有sudo权限的用户身份登录。根据你的Linux发行版和网络管理工具的不同,相应的命令可能略有不同。使用以下命令编辑网络配置文件,例如eth0网卡的配置文件: 注意:ifcfg-eth0 可能会有不同的命…...

Mall脚手架总结(四) —— SpringBoot整合RabbitMQ实现超时订单处理

前言 在电商项目中,订单因为某种特殊情况被取消或者超时未支付都是比较常规的用户行为,而实现该功能我们就要借助消息中间件来为我们维护这么一个消息队列。在mall脚手架中选择了RabbitMQ消息中间件,接下来荔枝就会根据功能需求来梳理一下超时…...

python实现图像的直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分配图像中的像素值,使得图像的像素值分布更加均匀,增强图像的对比度,从而改善图像的视觉效果。 直方图均衡化的过程如下: 灰度转换:如果图像是彩色…...

哪种烧录单片机的方法合适?

哪种烧录单片机的方法合适? 首先,让我们来探讨一下单片机烧录的方式。虽然单片机烧录程序的具体方法会因为单片机型号、然后很多小伙伴私我想要嵌入式资料,通宵总结整理后,我十年的经验和入门到高级的学习资料,只需一…...

安规电容总结

安规电容 顾名思义:电容即使失效后,也不会漏电或者放电伤人,要符合安全规定 多数高压认证产品都需要。 上图: X电容: Y电容: 区别: 电路示意:...

MyCat分片垂直拆分

场景 在业务系统中 , 涉及以下表结构 , 但是由于用户与订单每天都会产生大量的数据 , 单台服务器的数据 存储及处理能力是有限的 , 可以对数据库表进行拆分 , 原有的数据库表如下。 现在考虑将其进行垂直分库操作,将商品相关的表拆分到一个数据库服务器&#…...

MongoDB bin目录没有mongo.exe命令

MongoDB从6.0版本开始就取消了在Bin目录中加入Compass连接工具,需要大家自行安装。 可以定位到我的文章 链接地址 点击右侧目录的 标题三:MongoDB Compass连接MongoDBMongoDB Compass的安装方法哦~...

Zookeeper分布式一致性协议ZAB源码剖析

文章目录 1、ZAB协议介绍2、消息广播 1、ZAB协议介绍 ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面,Zookeeper 并…...

微软 AR 眼镜新专利:包含热拔插电池

近日,微软在增强现实(AR)领域进行深入的研究,并申请了一项有关于“热插拔电池”的专利。该专利于2023年10月5日发布,描述了一款采用模块化设计的AR眼镜,其热插拔电池放置在镜腿部分,可以直接替代…...

软件TFN 2K的分布式拒绝攻击(DDos)实战详解

写在前头 本人写这篇博客的目的,并不是我想成为黑客或者鼓励大家做损坏任何人安全和利益的事情。因科研需要,我学习软件TFN 2K的分布式拒绝攻击,只是分享自己的学习过程和经历,有助于大家更好的关注到网络安全及网络维护上。 需要…...

计算机网络第四章——网络层(末)

赌书消得泼茶香当时只道是寻常 文章目录 概述:组播机制是让源计算机一次发送的单个分组可以抵达用一个组地址标识的若干目标主机,并被它们正确接收,组播仅应用于UDP 因特网中的IP组播也使用组播组的概念,每个组都有一个特别分配的…...

Newman基本使用

目录 简介 安装 使用 官网 运行 输出测试报告文件 htmlextra 使用 简介 Newman 是 Postman 推出的一个 nodejs 库,直接来说就是 Postman 的json文件可以在命令行执行的插件。   Newman 可以方便地运行和测试集合,并用之构造接口自动化测试和持续集成…...

左值引用右值引用

文章目录 左值和右值什么是左值什么是右值左值引用与右值引用的比较左值引用总结右值引用的总结: 右值引用使用场景和意义左值引用的使用场景左值引用的短板 右值引用和移动语义解决上面的问题不仅仅有移动构造还有移动赋值 右值引用引用左值及其一些更深入的使用场…...

学习开发一个RISC-V上的操作系统(汪辰老师) — 一次RV32I加法指令的反汇编

前言 (1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接; (3)PLCT实验室实习生长期招聘:招聘信息链接 前置知识 RISC-V 汇编指令编码格式 &a…...

IDEA中点击New没有Java Class

解决办法:右键src,也可以是其他文件名,点击Mark Directory as 点击Sources Root即可...

打造炫酷效果:用Java优雅地制作Excel迷你图

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 迷你图是一种简洁而有效的数据可视化方式,常用于展示趋势和变化。它通常由一…...

pycharm设置pyuic和pyrcc

pyuic设置 适合任何虚拟环境,直接用虚拟环境的python解决一切。。。 E:\anaconda3\envs\qt5\python.exe-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py$FileDir$pyrcc设置 E:\anaconda3\envs\qt5\python.exe-m PyQt5.pyrcc_main $FileName$ -o…...

OpenCV6-图形绘制

OpenCV6-图形绘制 1.绘制圆形2.绘制直线3.绘制椭圆4.绘制多边形5.文字生成6.demo 1.绘制圆形 void cv::circle(InputOutputArray img, // 需要绘制圆形的图像Point center, // 圆心坐标int radius, // 半径,单位为像素const Scalar& colo…...

kafka消费者程序日志报错Offset commit failed问题研究

生产环境偶尔会遇到kafka消费者程序日志报错的问题 截取主要日志如下: 2023-10-02 19:35:28.554 {trace: d7f97f70dd693e3d} ERROR[Thread-49:137] ConsumerCoordinator$OffsetCommitResponseHandler.handle(812) - [Consumer clientIdconsumer-1, groupIdcid_yin…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...