Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Mongoose预更新钩子工作,但更改不会反映在数据库中

Mongoose预更新钩子工作,但更改不会反映在数据库中
EN

Stack Overflow用户
提问于 2021-05-04 19:20:47
回答 1查看 188关注 0票数 0

我觉得我遗漏了一些非常简单的东西,但是我无法获得要更新的contact.fullName值。contact.middleName会按预期进行更新。

钩子被触发,所做的更改会反映在conlog中,但不会反映在DB中。fullName字段拒绝更新,但没有抛出错误。我感觉我在这里失去了理智

Mongoose模式/模型:

代码语言:javascript
代码运行次数:0
复制
const Contact = new mongoose.Schema({
  firstName: { type: String, required: true },
  middleName: { type: String, required: false },
  lastName: { type: String, required: true },
  fullName: { type: String, required: false },
});

// When a Contact is created, we populate the `fullName` field using a pre-save
// hook, which is working as expected:

Contact.pre('save', function (next) {
  const contact = this;
  contact.fullName = `${contact.firstName || ''} ${contact.lastName || ''}`;
  
  return next();
});

// on update, we want to update the fullName field as well. This is broken:

Contact.pre(\(updateOne|update)\, function (next) {
  const contact = this;
  const update = contact._update['$set'];

  const newFullName = `${update['firstName'] || ''} ${update['lastName'] || ''}`;
  console.log(newFullName);

  contact.fullName = newFullName;

  console.log(contact.fullName);  // i can see the correctly updated value here!

  if (update['middleName']) contact.middleName = update['middleName'];

  console.log(contact.middleName);  // i can also see this one!
  
  return next();
});

调用updateOne操作的函数(如果相关):

代码语言:javascript
代码运行次数:0
复制
module.exports.updateContact = (req, res, next) => {
  const { contact } = req.body;

  Contact.updateOne({ _id: contactId }, { $set: { ...contact } }, (err, result) => {
    if (err) return next(err);

    return next(result);
  });
};
EN

回答 1

Stack Overflow用户

发布于 2021-05-05 02:11:49

问题是因为您调用的是Query#updateOne(),而不是Document#updateOne(),所以它将触发pre('updateOne')查询中间件,并且this将引用查询,而不是文档。在这种情况下,您应该将代码修改为类似以下内容:

代码语言:javascript
代码运行次数:0
复制
Contact.pre(\(updateOne|update)\, function (next) {
  const update = contact._update['$set'];

  const newFullName = `${update['firstName'] || ''} ${update['lastName'] || ''}`;

  this.set({ fullName: newFullName })

  return next();
});

更详细的here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67390900

复制
相关文章
如何在 Python 中的绘图图形上手动添加图例颜色和图例字体大小?
Plotly 的 update_layout() 方法以及legend_font_color和legend_font_size参数可用于手动添加图例颜色和字体大小。下面提供了语法的插图 -
很酷的站长
2023/08/11
8390
如何在 Python 中的绘图图形上手动添加图例颜色和图例字体大小?
为你的图片添加图例
图例可以帮助我们更好的理解图中的信息,在matplotlib中,通过legend函数来添加图例,有以下两种用法
生信修炼手册
2020/09/14
1.2K0
如何向图形添加曲形文本
R语言数据分析指南
2023/08/18
2190
如何向图形添加曲形文本
如何向数组里添加元素
一般数组是不能添加元素的,因为数组在初始化时就已定好长度了,不能改变长度,我们如何做到向其中添加元素。
算法与编程之美
2023/01/03
3.5K0
swiper组件添加左右箭头
前言:小程序官方swiper组件并未提供带左右箭头功能,但有些时候还是想把左右箭头添加上,今天连胜老师就给大家分享一下自己的实现方式。 思路很简单:在swiper组件内部添加两个image组件,绑定点击事件,动态改变swiper中的current值。不废话,主要看代码: WXML: <swiper indicator-dots="{{swiper.indicatorDots}}" autoplay="{{swiper.autoplay}}" interval="{{swiper.interval}}"
连胜
2018/03/07
2.9K0
swiper组件添加左右箭头
qcustomplot添加图例_qchart显示点数据
LXTracer::LXTracer(QCustomPlot *_plot, TracerType _type, QObject *parent)
全栈程序员站长
2022/11/08
2.2K0
java如何向数组中添加元素[数组的添加]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java如何向数组中添加元素[数组的添加],希望能够帮助大家进步!!!
Java架构师必看
2022/04/06
7.7K0
java如何向数组里添加元素
1、一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。 但有个可以改变大小的数组为ArrayList,即可以定义一个ArrayList数组,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素;例子如下:
全栈程序员站长
2022/06/27
20.6K0
Spring 中的 @Import 注解及向容器中添加 Bean 的几种方式
这次介绍一下 Spring 中的一个重要的注解 @Import 以及向容器中添加 Bean 的几种方式 ,该注解在 SpringBoot 自动转配中起到重要的作用。
wsuo
2020/07/30
1.7K0
ggasym轻松给热图添加多个图例
R语言数据分析指南
2023/08/18
2160
ggasym轻松给热图添加多个图例
如何向已有的项目中添加C/C++代码?
  我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码:
故乡的樱花开了
2023/10/22
2930
qpainter画箭头改变方向_visio如何画箭头
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
2.1K0
qpainter画箭头改变方向_visio如何画箭头
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
3580
向邮件添加附件
可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart或%Net.MailMessage的实例)。要执行此操作,请使用以下方法:
用户7741497
2022/06/09
2.1K0
2018-07-19 如何重构“箭头型”代码如何重构“箭头型”代码
原文地址:https://coolshell.cn/articles/17757.html
Albert陈凯
2018/07/24
9860
2018-07-19 如何重构“箭头型”代码如何重构“箭头型”代码
如何使用 Bootstrap class 向按钮添加下拉菜单
如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单,只需要简单地在一个 .btn-group 容器中放置按钮和下拉菜单即可。您也可以使用 <span class="caret"></span> 来指示按钮作为下拉菜单。
好派笔记
2021/09/18
5.6K0
spring:如何用代码动态向容器中添加或移除Bean ?
先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F
菩提树下的杨过
2018/01/18
5.1K0
spring:如何用代码动态向容器中添加或移除Bean ?
质量看板开发实践(五):给echarts图例添加数值
官方文档:https://echarts.apache.org/zh/option.html#legend.formatter
冰霜
2022/05/01
3K0
matlab画图,添加图名,坐标轴名,曲线名称(图例)[通俗易懂]
matlab画完曲线图后,需要添加:图像名称(Title),坐标轴名(Label),图例(Legend)
全栈程序员站长
2022/09/28
5.6K0
matlab画图,添加图名,坐标轴名,曲线名称(图例)[通俗易懂]
点击加载更多

相似问题

如何向ggplot添加图例

11

如何向hline添加图例?

12

如何向散点图添加图例

21

向散点图添加图例

20

向绘图添加图例

129
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档