node.js mongoose中间件(middleware)

目录

简介

定义模型

注册中间件

创建doc实例,并进行增删改查

方法名和注册的中间件名相匹配

执行结果

分析

错误处理中间件 

手动抛出错误

注意点


简介

在mongoose中,中间件是一种允许在执行数据库操作前(pre)或后(post)执行自定义逻辑的机制。

定义模型

const mongoose = require('mongoose');
const schema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true
    }
  },
);

注册中间件

pre为前置中间件,post为后置中间件,允许正则匹配

schema.pre('validate', function(next){  
// this指向正在验证的doc
  console.log('doc validate before')
  next()
})
schema.post('validate', function(doc) { 
//this == doc   true
  console.log('doc validated')
})

schema.pre('save', function(next){  
// this指向正在验证的doc
  console.log('doc save brfore')
  next()
})
schema.post('save', function(doc) {  
//this == doc   true
  console.log('doc saved')
})

schema.pre('init', function(doc) { 
// doc是查询的文档
  console.log('doc init before')
})

schema.post('init', function(doc) {  
// this == doc   true
  console.log('doc inited')
})

schema.pre(/find/, function() {   
//this指向Query实例 
  console.log('doc find')
})

schema.post(/find/, function(doc) { 
// doc是查询的文档
  console.log('doc finded')
})

schema.pre('updateOne', function(next){ 
//this指向Query实例  _conditions: { _id: new ObjectId('658147685eca07e7b0c52259') }
  console.log('doc update before')
  next()
})

schema.post('updateOne', function(res) { 
// res更新结果
  console.log('doc updated') 
})

schema.pre('deleteOne', function(next){  
//this指向Query实例  _conditions: { _id: new ObjectId('658147685eca07e7b0c52259') }
  console.log('doc remove before')
  next()
})

schema.post('deleteOne', function() {  
// res删除结果
  console.log('doc removed')
})

schema.pre('aggregate', function() {  
// this指向正在处理的aggregate
})

schema.pre('aggregate', function() {  
// this指向正在处理的aggregate
})

const Model = mongoose.model('SchemaIdentify', schema)

创建doc实例,并进行增删改查

app.post('/', async (req, res) => {
  const doc = new Model({
    name: 'saaaaaaaaaa',
  })
  await doc.save()
  await Model.findById(doc._id)
  await Model.updateOne({_id: doc._id}, {name: 'hahahahah'})
  await Model.deleteOne({_id: doc._id})  
  res.status(200).json()
})

方法名和注册的中间件名相匹配

执行结果

分析

Mongoose 内部有一个内置的 pre('save') 钩子,它会调用 validate() 方法,从而触发中间件。因此,在执行 save() 之前,所有注册的 pre('validate') 和 post('validate') 钩子都会被调用

schema.pre('save', async function(next){ // 模拟内置
  await this.validate() // this指向正在处理的doc
  next()
})

注册validate、save、/find/ 、/update/、/delete/等前置中间件接收一个next函数,可以控制next决定是否继续执行注册的中间件, 回调函数中的this有不同的指向,validate、save中间件指向正在处理的文档, /find/ 、/update/、/delete/等中间件中的this指向Query实例。后置中间件validate、save接收一个参数表示处理过的doc,/find/接收一个参数表示查询结果doc或docs、/update/、/delete/等中间件接收一个参数表示处理的结果, 第二个参数为next。

/find/ :

/update/:

/delete/:

错误处理中间件 

当执行某操作的时候如果发生错误,后置中间件会接收一个error参数,并且不会继续执行后续的中间件,规定定义三个参数

不传入更新的内容

schema.post('updateOne', function(error, res, next) { // res更新结果
  console.log('doc updated', error)
  next()
})


手动抛出错误

不管是前置、后置,任何中间件中手动抛出一个错误也不会继续往下执行中间件

schema.post(/find/, function(doc) {
  throw new Error('eeeerrror')
})

注意点

1、中间件如果不声明next参数,执行完则默认继续执行下一个中间件,如果中间件声明了next不调用则卡在这个中间件(声明必调用,要不就不声明)

2、在const Model = mongoose.model('SchemaIdentify', schema) 编译之前声明中间件,否则中间件不会执行

3、/update/ 中间件并不会触发save中间件,也就不会调用validate(),即也不会执行validate中间件。可以调用Model.findOneAndUpdate或findByIdAndUpdat,设置第三个参数options { runValidators: true },允许monggose进行数据校验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI图集】猫狗的自动化合成图集

猫是一种哺乳动物,通常被人们作为宠物饲养。它们有柔软的毛发,灵活的身体和尖锐的爪子。猫是肉食性动物,主要以肉类为食,但也可以吃一些蔬菜和水果。猫通常在夜间活动,因此它们需要足够的玩具和活动空间来保持健康和快…

【python基础】-- yarn add 添加依赖的各种类型

目录 1、安装 yarn 1.1 使用npm安装 1.2 查看版本 1.3 yarn 淘宝源配置 2、安装命令说明 2.1 yarn add(会更新package.json和yarn.lock) 2.2 yarn install 2.3 一些操作 2.3.1 发布包 2.3.2 移除一个包 2.3.3 更新一个依赖 2.3.4 运行脚本 …

ASP.NET Core MVC依赖注入理解(极简个人版)

依赖注入 文献来源:《Pro ASP.NET Core MVC》 Adam Freeman 第18章 依赖注入 1 依赖注入原理 所有可能变化的地方都用接口在使用接口的地方用什么实体类通过在ConfigureService中注册解决注册的实体类需要指定在何种生命周期中有效 TransientScopedSingleton 2…

【办公软件】C# NPOI 操作Excel 案例

文章目录 1、加入NPOI 程序集,使用nuget添加程序集2、引用NPOI程序集3、设置表格样式4、excel加载图片5、导出excel 1、加入NPOI 程序集,使用nuget添加程序集 2、引用NPOI程序集 private IWorkbook ExportExcel(PrintQuotationOrderViewModel model){//…

国货之光,复旦发布大模型训练效率工具 CoLLiE,效率显著提升

在这个信息爆炸的时代,大型语言模型(LLM)成为理解和挖掘文本信息的重要工具。为了更好地适应各种应用场景,对 LLM 进行定制化训练变得至关重要。 在预训练 LLM 的过程中,无论是初学者还是经验丰富的炼丹人士&#xff…

数据分析基础之《numpy(4)—ndarry运算》

一、逻辑运算 当我们要操作符合某一条件的数据时,需要用到逻辑运算 1、运算符 满足条件返回true,不满足条件返回false # 重新生成8只股票10个交易日的涨跌幅数据 stock_change np.random.normal(loc0, scale1, size(8, 10))# 获取前5行前5列的数据 s…

光模块市场分析与发展趋势预测

光模块是光通信领域的重要组成部分,随着数字经济,大数据,云计算,人工智能等行业的兴起,光模块市场经历了快速发展,逐渐在数据中心、无线回传、电信传输等应用场景中得到广泛应用。本文将基于当前光模块全球…

画图之C4架构图idea和vscode环境搭建篇

VS Code 下C4-PlantUML安装 安装VS Code 直接官网下载安装即可,过程略去。 安装PlantUML插件 在VS Code的Extensions窗口中搜索PlantUML,安装PlantUML插件。 配置VS Code代码片段 安装完PlantUML之后,为了提高效率,我们最好安装PlantUML相关的代码片段。 打开VS Cod…

基于SSM的游戏资源管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Vue 使用 js-audio-recorder 实现录制、播放、下载音频

Vue 使用 js-audio-recorder 实现录制、播放、下载 PCM 数据 Vue 使用 js-audio-recorder 实现录制、播放、下载 PCM 数据js-audio-recorder 简介Vue 项目创建下载相关依赖主界面设计设置路由组件及页面设计项目启动源码下载 Vue 使用 js-audio-recorder 实现录制、播放、下载 …

【Hadoop精讲】HDFS详解

目录 理论知识点 角色功能 元数据持久化 安全模式 SecondaryNameNode(SNN) 副本放置策略 HDFS写流程 HDFS读流程 HA高可用 CPA原则 Paxos算法 HA解决方案 HDFS-Fedration解决方案(联邦机制) 理论知识点 角色功能 元数据持久化 另一台机器就…

VSCode报错插件Error lens

1.点击左侧扩展图标→搜索“error lens”→点击“安装” 2.安装成功页面如下: 3.代码测试一下:书写代码的过程中会出现红色提醒或红色报错 4.另外推荐小伙伴们安装中文插件,学习过程中会比较实用方便,需要安装中文插件的小伙伴请点…

智能优化算法应用:基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MA…

SoC芯片中的复位

文章目录 文章前情预告一、复位是什么?二、为什么要有复位?1.复位可以让电路有一个确定的初始状态2.复位可以使电路从错误状态回到可以控制的确定状态 三、 复位有什么类型,复位的注意事项!四、 复位的概念在其他方面的体现五、 复…

3d游戏公司选择云电脑进行云办公有哪些优势

随着游戏行业的不断发展,很多的游戏制作公司也遇到了很多的难题,比如硬件更换成本高、团队协同难以及效率低下等问题,那么如何解决游戏行业面临的这些行业痛点,以及游戏制作公司选择云电脑进行云办公有哪些优势?一起来…

OpenAI 疑似正在进行 GPT-4.5 灰度测试!

‍ 大家好,我是二狗。 今天,有网友爆料OpenAI疑似正在进行GPT-4.5灰度测试! 当网友询问ChatGPT API调用查询模型的确切名称是什么时? ChatGPT的回答竟然是 gpt-4.5-turbo。 也有网友测试之后发现仍然是GPT-4模型。 这是有网友指…

13 v-show指令

概述 v-show用于实现组件的显示和隐藏,和v-if单独使用的时候有点类似。不同的是,v-if会直接移除dom元素,而v-show只是让dom元素隐藏,而不会移除。 在实际开发中,v-show也经常被用到,需要重点掌握。 基本…

【CLion】使用CLion开发STM32

本文主要记录使用CLion开发STM32,并调试相关功能 使用的CLion版本:2023.3.1 CLion嵌入式配置教程:STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载:Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

ros2机器人在gazebo中移动方案

原文连接Gazebo - Docs: Moving the robot (gazebosim.org) 很重要的地方:使用虚拟机运行Ubuntu的时候,需要关闭”加速3D图形“的那个选项,否则gazebo无法正常显示。 Moving the robot(使用命令移动机器人示例) In t…

通用的java中部分方式实现List<自定义对象>转为List<Map>

自定义类 /*** date 2023/12/19 11:20*/ public class Person {private String name;private String sex;public Person() {}public Person(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public String getSex() {return…