node.js mongoose middleware

目录

官方文档

简介

定义模型

注册中间件

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

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

执行结果

分析

错误处理中间件 

手动抛出错误

注意点


官方文档

Mongoose v8.0.3: Middleware

简介

在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指向正在验证的docconsole.log('doc validate before')next()
})
schema.post('validate', function(doc) { 
//this == doc   trueconsole.log('doc validated')
})schema.pre('save', function(next){  
// this指向正在验证的docconsole.log('doc save brfore')next()
})
schema.post('save', function(doc) {  
//this == doc   trueconsole.log('doc saved')
})schema.pre('init', function(doc) { 
// doc是查询的文档console.log('doc init before')
})schema.post('init', function(doc) {  
// this == doc   trueconsole.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指向正在处理的docnext()
})

注册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进行数据校验。

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

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

相关文章

DDD领域驱动设计(二)

软件系统复杂性的应对 解决复杂和大规模软件的武器可以粗略的归位三种:抽象 分治和知识 抽象: 使用抽象能够精简问题空间,而且问题越小越容易理解。比如你去一个地方 一开始的时候并不需要确定用什么方式到达。分治: 类似算法里面的dp用的就是分治的想法。分割后的…

破局新渠道|2023年热度全域达人分销生态大会回顾

12月7日,由热度电商、热度云、集脉新电商联合举办的「破局新渠道」热度全域达人分销生态大会暨热度云3.0发布会在杭州国际博览中心圆满收官。大会邀请了平台官方、电商协会、品牌方、业务操盘手、数据专家、团长机构、达人等达人分销生态中的多个角色,从…

Python办公—pandas读取Excel表格增加列、两列保持一致、依条件修改单元格内容(附代码)

目录 专栏导读背景插入一列插入多列依条件修改单元格内容(2个条件以内)依条件修改单元格内容(3个条件以上)两列保持一致结尾 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页&am…

2023年中国数据智能管理峰会(DAMS上海站2023)-核心PPT资料下载

一、峰会简介 数据已经成为企业的核心竞争力!谁掌控数据、更好的利用数据、实现资产化,谁就会真正率先进入大数据时代。 1、数据智能管理趋势和挑战 在峰会上,与会者讨论了数据智能管理的最新趋势和挑战。随着数据量的不断增加&#xff0c…

JNI逆向

IDA:JNI类型转换 1.IDA高版本(IDA 高版本内置了定义的JNI结构体; 如果没有的话,在Views->Open subviews -> Type Libraries 中添加Android ARM的lib即可) 解决方法: 只需要对JNIEnv 指针(JNIEnv * &#xff09…

使用postman时,报错SSL Error: Unable to verify the first certificate

开发中使用postman调用接口,出现以下问题,在确认路径、参数、请求方式均为正确的情况下 解决方法 File - Settings -> SSL certification verification 关闭 找到图中配置,这里默认是打开状态,把它关闭即可:ON …

虾皮测评选品:如何在虾皮平台上进行有效的产品测评和选品

在如今的电商市场中,虾皮(Shopee)平台已经成为了卖家们最为重要的销售渠道之一。而在虾皮平台上进行产品测评和选品对于卖家来说至关重要,它直接影响到店铺的销售额和利润。本文将为您提供一些关于如何在虾皮平台上进行有效的产品…

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

前言 当前使用SaaS系统的企业越来越多,当我们需要对SaaS系统中产生的数据进行分析和对接时就需要与SaaS系统提供的API进行对接,因为SaaS一般是不会提供数据库表给企业,这时就应该使用ETL(Extract, Transform, Load)的…

复杂 SQL 实现分组分情况分页查询

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、根据 camp_status 字段分为 6 种情况 1.1 SQL语句 1.2 SQL解释 二、分页 SQL 实现 2.1 SQL语句 2.2 根据 camp_type 区分返…

Unity中Shader测试常用的UGUI功能简介

文章目录 前言一、锚点1、锚点快捷修改位置2、使用Anchor Presets快捷修改3、Anchor Presets界面按下 Shift 可以快捷修改锚点和中心点位置4、Anchor Presets界面按下 Alt 可以快捷修改锚点位置、UI对象位置 和 长宽大小 二、Canvas画布1、UGUI中 Transform 变成了 Rect Transf…

Linux 操作系统(查看文件内容)

cat 格式:cat [选项]...[文件]... 说明:把多个文件连接后输出到标准输出(屏幕)或者加”> 文件名” 输出到另一个文件中 常用选项: -b或—number-noblank: 从1开始对所有非空输出行进行编号 -n或—number: 从1开始所…

网络协议小记

一、TCP/IP协议 作为一个小萌新,当然我无法将tcp/ip协议的大部分江山和盘托出,但是其中很多面试可能问到的知识,我觉得有必要总结一下! 首先,在学习tcp/ip协议之前,我们必须搞明白什么是tcp/ip协议。 1、…

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层,负责处理不同方面的任务和逻辑,两者之间是存在一些区别和联系的,我会从以下几个方面来阐述: 一、定位和职责 前端架构 主要关注用户界面和用户体验,负责处理用户与…

打造中国人自己的GPTs,百度灵境矩阵升级为智能体平台

12月18日,百度「灵境矩阵」平台全新升级为「文心大模型智能体平台」。灵境矩阵基于文心大模型,为开发者提供多样化的开发方式,支持广大开发者根据自身行业领域、应用场景,选取多样化的开发方式,打造大模型时代的原生应…

关于我对归纳偏置(inductive bias)的概念和应用的详细总结

归纳偏置(inductive bias) 1.归纳偏置(inductive bias)的概念2.归纳偏置(inductive bias)的应用 1.归纳偏置(inductive bias)的概念 归纳偏置(inductive bias&#xff0…

贪吃蛇(二)绘制地图

绘制地图主要是考察基础的循环和分支控制&#xff0c;视频没看完&#xff0c;自己写了一下。 绘制一个基础地图 #include"curses.h" void cursesinit() {initscr();keypad(stdscr,1); }void mapinit() {int row;int col;for(row 0;row < 20;row){if(row 0 || …

如何在 FastAPI 中设置定时任务:完全指南

Web 应用程序开发中&#xff0c;及时高效处理常规任务至关重要&#xff0c;包括定时收集数据或管理任务计划。针对强大且性能卓越的 FastAPI 框架&#xff0c;我们可以通过几种策略来管理这些必要的定时任务。 实现 FastAPI 中的定时任务 本指南将探讨在 FastAPI 环境中管理定…

工业6轴机械臂运动学逆解(解析解)

工业6轴机械臂运动学逆解&#xff08;解析解&#xff09; 通常工业机械臂采用6旋转轴串连的形式&#xff0c;保证了灵活性&#xff0c;但为其运动学逆解&#xff08;即已知机械臂末端的位姿 P P P&#xff0c;求机械臂各个旋转轴的旋转角&#xff09;带来了较大的困难&#xff…

倒计数器:CountDownLatch

CountDownLatch 是 Java 中用于多线程编程的一个同步工具。 它允许一个或多个线程等待其他线程执行完特定操作后再继续执行。 CountDownLatch 通过一个计数器来实现&#xff0c; 该计数器初始化为一个正整数&#xff0c;每当一个线程完成了指定操作&#xff0c;计数器就会减一。…

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 总结 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库&#xff0c;专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式…