首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么使用mongoose回调会导致两次保存数据?

使用mongoose回调会导致两次保存数据的原因是因为在回调函数中,当执行保存操作时,会触发mongoose的中间件机制。在中间件中,如果没有正确处理回调函数的执行流程,可能会导致数据保存操作被重复执行。

具体来说,当使用mongoose进行数据保存时,可以通过pre和post中间件来定义在保存操作之前和之后执行的逻辑。如果在pre中间件中执行了保存操作,而在回调函数中又执行了一次保存操作,就会导致数据被保存两次。

为了避免这种情况发生,可以在回调函数中正确处理执行流程,例如使用条件判断来确保只在特定情况下执行保存操作,或者在pre中间件中执行保存操作后,使用return语句来终止回调函数的执行。

总结起来,使用mongoose回调会导致两次保存数据的原因是在回调函数中没有正确处理执行流程,导致数据保存操作被重复执行。为了避免这种情况发生,需要在回调函数中进行适当的条件判断或者在pre中间件中执行保存操作后终止回调函数的执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

mogoose 创建数据库并增删改查

是否必须 是否重复 默认值 等,如下定义了一个用户表结构 注意:如果定义表结构时没有定义_id,mongoose自己添加一个该字段,该字段不会重复,类型为ObjectId,通过findById()查询...添加`createdAt updatedAt`创建时间和更新时间两个字段 } ); 如果在定义了结构后需要添加新字段,在实例上使用add()方法 创建表model 通过mongoose.model...(name,sechem)来创建表结构构造器,通过传入数据来实例化构造器获得具体的表 注意:在这一步的时候数据库已经有了表,表名全是小写且表明为name加上s,如这里创建表users const User...(userData); 保存save 获得具体的表后只需要调用Model.prototype.save就会把数据存入数据库中 注意:该方法为异步方法 await user.save(); 通过Model.create...方法: 通过表构造器的静态方法create自动在表中插入新的数据 该方法可以接收多个插入数据,最后的函数参数根据数据量决定 该方法支持两种调用: 错误优先的 async await const

5.1K30
  • 48、mongoose入门

    ,再结合我这篇文章亲自实践操作一番,效果可能更好。...1、约定 现在假设我们想把看到的每一只猫都用数据库给记录下来,即每只猫都是一条document(数据行)。 2、什么是mongoose?...mongoose入门—狼叔 mongoose官网快速入门篇 3、安装mongoose $ npm install mongoose 4、连接数据库并监听数据库是否连接成功 var mongoose...中添加了一个speak的方法,该方法会暴露在每一个文档实例中,于是所有的实例都可访问到这个方法(类似于原型链中方法的继承) silence.speak(); // My name is Silence 8、保存数据库...ok,现在我们看到的这只猫又有名字又会说话了,接下来就是把它保存到MongoDB数据库中; save方法用于保存document到数据库,第一个参数err用于检测函数是否报错。

    2K31

    Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一、聊天室简单介绍   采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制。聊天室增加了 注册登录 模块 ,并将用户个人信息和聊天记录存入数据库....数据库采用的是mongodb , 并使用其相应mongoose对象工具来处理数据的存取。 功能主要涉及:群聊、私聊、设置个人信息、查看聊天记录、查看在线用户等 效果图: ?   ...}else{ console.log('users list --default: '+docs); // 因为是函数...ssocket.emit('user_list',docs); //更新用户列表 } }); } 如此之类,数据数据的存取就使用这种方式...这样做是为了避免一个问题: 函数里头function(err,docs)是属于函数的,也就是说getUserUp()函数的处理完与函数中搜索在线用户的处理完 是两个概念。

    2.6K10

    Mongoose学习参考文档

    ){ //一次打开记录 }); 注意:   成功开启数据库后,就可以执行数据库相应操作,假设以下代码都在中处理 4.定义一个Schema var PersonSchema...,由于包含children2,他是一个数据库模型对象,因此保存chilren2[0]和chilren2[1]。   ...6.1 查询的方式   通常有2种查询方式,一种是直接查询,一种是链式查询(2种查询都是自己命名的) 6.1.1 直接查询   在查询时带有函数的,称之为直接查询,查询的条件往往通过API来设定,例如...这种方式相对直接查询,分的比较明细,如果不带callback,则返回query,query没有执行的预编译查询语句,该query对象执行的方法都将返回自己,只有在执行exec方法时才执行查询,而且必须有...,不是什么数据都能往数据库里丢或者显示到客户端的,数据的验证需要记住以下规则: 验证始终定义在SchemaType中 验证是一个内部中间件 验证是在一个Document被保存时默认启用的,除非你关闭验证

    24.2K90

    在Node中如何操作MongoDB数据

    MongoDB是一款流行的文档型数据库,可以在Node.js中使用官方的MongoDB包或者第三方包mongoose进行操作。...projection, options, callback);其中,filter 表示查询条件,update 表示更新操作,projection 表示指定返回的字段,options 表示查询选项,callback 表示函数...在Node.js中,我们可以使用MongoDB官方提供的mongodb包来操作数据库,也可以使用第三方包mongoosemongoose对mongodb进行了二次封装,使用起来更加方便。...在使用mongoose时,我们需要先设计Schema,然后将其发布为Model,最后使用Model来对数据库进行增删改查等操作。...同时,使用MongoDB数据库需要注意的是,我们需要在Node.js中使用mongoose.connect或者mongodb.MongoClient.connect方法来连接数据库,然后才能对数据库进行操作

    28800

    Mongoose模块化实践

    Mongoose为操作MongoDB数据库提供了很大的方便,在实际开发过程中,为了保证可扩展与可维护性,通常会将Mongoose进行模块化,下面记录一个模块化的实例,便于在以后的项目中复用。 1....定义db.js,连接数据库 var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/test',...') }); module.exports = mongoose 连接参数说明: 第一个参数为数据库的地址,如果设置了密码的话,记得加上用户名和密码,格式如下: mongodb://test_admin...第三个参数 为函数用来确认数据库是否连接成功。 2. 引入定义的db.js文件,生成schema,建立模型并导出,文件名为user.js var mongoose=require('....,那么调用多个schema时,是否多次连接数据库了,其实在mongoose的底层已经做了单例模式的处理,也就是说只会在第一次连接时比较耗时,后续的连接执行都会很快。

    1K20

    Nodejs学习笔记(十四)— Mongoose介绍和入门

    简介   Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具   那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考...mongoose安装 npm install mongoose   安装成功后如下图: ?   安装成功后,就可以通过 require('mongoose') 来使用!...里会用到的一种数据模式,可以理解为表结构的定义;每个schema映射到mongodb中的一个collection,它不具备操作数据库的能力   我们先改造一下db.js,导出mongoose对象  ...mongoose操作基本入门大致就是这些,自已试一下,入门完全没问题,并且比node-mongodb-native还是要简单明了一些,   在node.js中操作数据库,如果逻辑相对复杂时,大量的嵌套还是比较郁闷的...,下一篇于mongoose操作多逻辑组合嵌套的问题给出一种方案^_^!

    2.6K60

    Node.js 搭建一个 API 接口服务(实战)

    为什么要用node 最主要的一点是其他语言咱也不会啊。。。 ?...当然,前面说的都是虚的,其实真正吸引我的是koa通过es6的写法,利用async函数,解决了express.js中地狱的问题,并且koa不像express一样自带那么多中间件,对于一个私有项目来说,...,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一 Mongodb 为什么用了mysql...不过这个项目除了使用mysql,也还有用到mongo,接下来看看mongodb怎么用 使用mongoose作为mongodb的中间件 // mongoose入口 import mongoose from...使用mock来生成测试数据 日志 日志模块本来打算是用log4.js来做的,后来感觉做的日志模块还没达到预期,所以就决定先暂时用pm2的日志系统来代替log4。

    8.2K31

    数据技术之_22_MongoDB学习_MongoDB 的简介、下载、安装、启动、配置和关闭 + MongoDB 的基本操作 + Mongoose + 使用 java 对 MongoDB 增删改查

    ,通过 Model 才能对数据库进行操作 // mongoose.model(modelName, schema): // modelName 就是要映射的集合名称,mongoose 自动将集合名称变成复数...callback 当操作完成以后调用的函数。...         options     查询选项(常用 skip、limit)                  示例:{skip: 3, limit: 1}          callback    函数...,查询结果会通过函数返回                      这里函数必须传,如果不传回函数,压根就不会去查询 */ ---------------------------------...用来修改一个或多个文档     - 参数:          conditions 查询条件          doc 修改后的对象          options 配置参数          callback 函数

    17.8K30

    Node.js 服务连接 MongoDB 处理最佳实践

    数据库断开连接后,所有涉及到数据库读写操作的命令均会立即返回错误,而不会等待重连进而造成接口超时 服务启动并成功与数据库建立连接后,如果数据库出现问题造成连接中断,服务自动尝试重连直到连接成功 无需手动处理连接数...mongoose 自己维护一个默认最大数量为 5 的连接池,只有当你发现有一些慢查询可能阻塞快查询时才应该考虑增大 poolSize。...当然,这个数字不能设置得过大,MongoDB 默认是一个连接启动一个线程来服务,连接太多线程数切换系统开销很大。...解决方法也不是没有,就是比较鸡肋:在 mongoose 连接的 'error' 事件监听函数中尝试重连。但是需要设置最大重试次数,否则会发生内存泄露。...因此,使用这套连接方式务必要注意数据库保持可连接状态。或者读者们如果有更好的解决方案,也希望能不吝赐教。 完。

    3.5K20

    使用Mongoose的populate方法实现多表关联查询

    定义文章分类的schema生成模型导出,文件名 aritcleCate.js // 引入自定义的数据库连接文件 var mongoose=require('....定义用户的schema生成模型导出,文件名 user.js // 引入自定义的数据库连接文件 var mongoose = require('....定义文章的 schema 生成模型导出,文件名 article.js 通过给 schema 中的关联字段添加 ref 与指定的模型建立关联 // 引入自定义的数据库连接文件 var mongoose =...执行查询操作 // 注意使用 populate 需要引入用到的 model var ArticleCateModel=require('....').exec(function(err,docs){ console.log(docs); }) 通过给 populate 中传入所关联的字段与指定的集合进行关联查询,在 exec( ) 的方法中获取查询的结果

    3.6K20

    Node.js究竟是什么?Node.js工作原理解析

    I/O 需要时间,因此阻止其他函数。 考虑一下这种情况,我们需要通过请求后端数据库来获取 user1 和 user2 的详细信息,然后在屏幕或控制台上打印它们。...在调用它时,先注册事件。事件将等待 2000 毫秒,然后这个函数。 在 API 中注册后,setTimeout(2000) 从调用堆栈中弹出。...等待 0 秒后,setTimeout(0) 被移动到队列,同样的事情发生在 setTimeout(2000)。 在队列中,函数等待调用栈为空,因为每个语句都执行一次。这由事件循环处理。...如果事件循环检测到到调用堆栈为空且队列不为空。它将回(以先进先出顺序)移动到调用栈并执行。 npm 这些是由令人敬畏的社区所构建的库,它能解决你的大多数的常规问题。...它加载从 npm 安装的第三方库,如 Express 和 Mongoose 等。 它允许你 require 自己的文件并把项目模块化。

    1.7K30

    Node.js 究竟是什么?

    I/O 需要时间,因此阻止其他函数。 考虑一下这种情况,我们需要通过请求后端数据库来获取 user1 和 user2 的详细信息,然后在屏幕或控制台上打印它们。...在调用它时,先注册事件。事件将等待 2000 毫秒,然后这个函数。 在 API 中注册后,setTimeout(2000) 从调用堆栈中弹出。...等待 0 秒后,setTimeout(0) 被移动到队列,同样的事情发生在 setTimeout(2000)。 在队列中,函数等待调用栈为空,因为每个语句都执行一次。这由事件循环处理。...如果事件循环检测到到调用堆栈为空且队列不为空。它将回(以先进先出顺序)移动到调用栈并执行。 npm ? npm 这些是由令人敬畏的社区所构建的库,它能解决你的大多数的常规问题。...它加载从 npm 安装的第三方库,如 Express 和 Mongoose 等。 它允许你 require 自己的文件并把项目模块化。

    1.5K40

    Node 简单总结

    如果事件存在则处理。接着处理下一个事件。 在Node中,事件来源有网络请求,文件io等。...网络请求是生产者,源源不断等为node提供不同的事件,这次事件被传递导对应的观察者那里,事件循环则从观察者那里取出事件并处理 Node8起新增了 util.promisify() 方法,可以快捷的把原来的异步方法改成返回...当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也体现出来,所以第三四个输出一样。...当 module.exports 属性被一个新的对象完全替代时,也重新赋值 exports 如果你觉得用不好可以只使用module.exports Event Loop event loop是一个执行模型...const mongoose = require('mongoose'); // MongoDB connect function mongoDBConnect() { mongoose.connect

    81530

    流动图书馆小程序实战

    技术栈 小程序MINA框架: 一个响应的数据绑定框架。...数据库 pm2: 服务端使用pm2部署,常驻进程 截图 首页 借阅书架 发布的图书 借阅的图书 客户端 代码结构 微信小程序中每个页面会有四个文件 .js .json .wxml .wxss...wx.onSocketClose(function(res){ console.log('websocket closed'); }); wx.onSocketMessage(function(res){ //收到消息的...操作数据库 db.js: const mongoose = require('mongoose'); mongoose.connect('mongodb://app:12345678@127.0.0.1...从数据库的设计到后台数据库操作、会话管理、http服务接口一直到前后端数据交互、小程序前端,我对程序开发的大致流程有了更进一步的了解,弥补的之前对服务端知识的缺失。

    2.2K121

    三步带你开发一个短链接生成平台

    snsapi_base&state=STATE&connect_redirect=1#wechat_redirect 用这个地址生成的二维码也是密密麻麻,虽不影响微信长按扫码,一旦二维码尺寸缩一点点,图片马上就会糊掉,导致摄像头直接扫码难以识别...现在市面上可用的就是微博的t.cn和一些第三方的生成短链接工具,但这两类工具都有一些使用上的问题,例如:t.cn现在的规则是会出现一个中转页不会直接跳转,而第三方的工具因为是一个公共平台,有时可能因一些不良信息导致整个平台无法访问...: 在这个应用中,我们使用了mongodb,之所以选择它是因为执行高效且低开销,所以执行起来也很高效,不过如果使用其他数据库也是没问题的。...: var objurl = { shortUrl: shortid, longUrl: url}; 最后,连接数据库并保存后将短链接结果返回客户端: mongoose.connect(setup.mongo_db...接收短链接码 var shortUrl = req.params.shortUrl; 连接数据库查询并跳转 mongoose.connect(setup.mongo_db, setup.mongo_options

    3.1K30

    mongoose、koa2和redis的简单安装使用

    mongoose的介绍及使用 参考之前文章:点击这里 koa2简介 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、...通过利用 async 函数,Koa 帮你丢弃函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。...npm start 监听启动项目 npm run dev 启动后打开网页如上,说明安装成功 async和await 作用是讲异步操作转化为同步的顺序, 用法: 函数前面使用 async...接收回结果的对象前面用await修饰 redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。...c7xs 说明该页面被访问了20次 案例中使用mongodb数据库,koa2基本框架实现了对数据库的增删改查操作,使用redis实现了简单页面访问次数统计 测试接口的方法 使用shell操作的curl

    64430
    领券