Mongoose 预保存钩子正在触发,但不保存附加字段(不使用 model.update)

2023-12-07

我正在尝试在我的架构中实现一个计数器来获取下一个问题编号。我已将其实现为 Mongoose 中的钩子预保存钩子,一切看起来都很好......除了实际的“数字”字段没有更新。我可以很容易地通过控制台记录的内容判断钩子正在触发,甚至该字段似乎已被分配。但可惜的是,无论我如何尝试,“数字”字段都不会出现在结果中。

我看到了一些与 Mongoose hooks 相关的问题,但它们似乎都与 findOneAndUpdate 等相关,而我没有使用这些问题。

这是我的完整模型,底部有挂钩:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Project = require('./projects.js');

var IssueSchema = new Schema({
    title: {type: String, required: true, trim: true,  index: true},
    number: {type: Number},
    description: {type: String, required: true},
    vote_up: {type: Number, default: 0},
    vote_down: {type: Number, default: 0},
    comments: [new Schema({
      _id: {type: Schema.ObjectId, ref: 'users'},
      description : {type: String},
      likes: {type: Number},
      date: {type: Date}
    })],
    attachments: [],
    fields: [new Schema({
      _id: {type: Schema.ObjectId, ref: 'fields'},
      value : {type: String}
    })],
    project: {type: Schema.ObjectId, required: true, index: true, ref: 'projects'},
    tags: {type: [Schema.ObjectId], required: false, default: ['56a2a0b1ea805d403f6d014b']},
    isResolved: {type: Boolean, default: false},
    created_by: {type: Schema.ObjectId, required: true, ref: 'users'},
    updated_by: {type: Schema.ObjectId, required: false, ref: 'users'},
    created_at: {type: Date, default: Date.now},
    updated_at: {type: Date, default: Date.now}
});

IssueSchema.pre('save', function(next){
    var now = new Date();
    this.updated_at = now;
    if(!this.created_at) {
        this.created_at = now;
    }
    next();
})
.pre('save', function(next) {
  Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) {
    if (err) {
      console.log(err);
    }
    console.log('pre-save hook firing');
      this.number = doc.numberSeq;
      console.log(this.number);
      next();
    });
})
.post('save', function(doc) {
  Project.update({_id: doc.project}, {$inc:  {numberSeq: 1}}, function(err, result) {
    if (err) {
      console.log(err);
    }
    console.log('Updated next number in seq for '  + doc.project);
  });
});

module.exports = mongoose.model('issues', IssueSchema);

以及插入问题的路线(我猜这不是问题所在)

app.post('/api/issue/create', function(req, res) {

    var issue = new Issues({
      title: req.body.title,
      description: req.body.description,
      fields: req.body.fields,
      attachments: req.body.attachments,
      project: req.body.project,
      created_by: req.user || req.body.created_by,
    });

    issue.save(function(err, result) {
      if (err) {
        return res.status(409).send({message: 'There was an error creating the issue: ' + err});
      }
      if (!result.number) {
        console.log('number = :(');
      }
      console.log(result);
      res.send({message: 'New issue created', result: result});
    });
  });

Screenshot of result from console with logging


你错过了this这里的上下文,

.pre('save', function(next) {
  Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) {
    if (err) {
      console.log(err);
    }
    console.log('pre-save hook firing');
      this.number = doc.numberSeq;
      console.log(this.number);
      next();
    });
})

你说的地方:

this.number = doc.numberSeq;
console.log(this.number);

实际上指的是 findOne 查询的回调函数,因此您最终会得到正确的 console.log 和插入的错误数据。

您可以记住预保存挂钩的上下文,然后在回调中使用该上下文更新数字。像下面这样:

.pre('save', function(next) {
  var tat=this;
  Project.findOne({_id: this.project}).select('numberSeq').exec(function(err, doc) {
    if (err) {
      console.log(err);
    }
    console.log('pre-save hook firing');
      tat.number = doc.numberSeq;
      console.log(tat.number);
      next();
    });
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongoose 预保存钩子正在触发,但不保存附加字段(不使用 model.update) 的相关文章

随机推荐

  • 是否可以阻止 JIT 优化方法调用?

    我们正在构建一个用于 Java 字节码程序的平均情况运行时分析的工具 其中一部分是测量实际运行时间 因此 我们将采用任意的 用户提供的方法 该方法可能有也可能没有结果 并且可能有也可能没有副作用 示例包括快速排序 阶乘 虚拟嵌套循环 并执行
  • 使用哈希值跟踪文件的唯一版本

    我将跟踪可能数百万个不同文件的不同版本 我的目的是对它们进行散列以确定我已经看到了该文件的特定版本 目前 我只使用 MD5 该产品仍在开发中 因此尚未处理过数百万个文件 这显然不够长 无法避免冲突 然而 这是我的问题 如果我使用两种不同的方
  • ffmpeg AVFrame 获取完整解码数据到 char*

    我在循环中获取帧并使用 ffmpeg 对其进行解码 得到 AVFrame 作为其结果 因此 我必须将帧的必要像素数据获取到 char 中 并作为回调函数的参数给出 那么如何生成这样的 char 数组呢 在互联网上我看到了一些例子 例如 fo
  • 每小时自动运行一次 php

    我使用的是共享 Windows 主机 其中允许通过 php 代码发送 120 封邮件 小时 我有一个 php 页面可以一次发送超过 200 封邮件 但我想每小时运行一次该页面 计划任务 我将拆分电子邮件 以 100 秒为单位 并希望每小时自
  • amp-iframe 内的 amp 页面上的 Disqus

    我尝试在 amp 文档上实现 Disqus 我的想法是使用amp iframe它加载一个仅包含 Disqus 的小文档 我用的是这个放大器框架
  • api.get_retweeter_ids() 实际上是如何工作的(Tweepy Python)?

    我对 twitter api 很陌生 我一直在尝试获取转发特定推文的每个人的 ID 列表 经过几次尝试后 我无法使用 api get retweeter ids 来获取每个 id 似乎总是能得到一些 我知道每个请求的限制为 100 个 但在
  • Javascript:如何避免在函数中添加新属性?

    我是一个JS新手 正在看书JavaScript 模式为了理解 我可以看到的代码片段之一 var myFunc function param myFunc cache 这表明函数体之外的任何人都可以添加新属性 这不会破坏封装吗 如果程序的其他
  • Delphi Firemonkey 跨平台 - 传递 Windows 句柄的通用方法

    我正沉浸在我的第二个适用于 Windows 和 OSX 的 Firemonkey 应用程序中 并慢慢地转换我的函数库以处理跨平台问题 我正在尝试创建一个通用的 SelectDirectory 函数 它将运行 Windows 或 OSX 平台
  • 如何告诉数据注释验证器也验证复杂的子属性?

    我可以在验证父对象时自动验证复杂的子对象并将结果包含在填充的结果中吗ICollection
  • 斯特林格的行为令人费解?

    Go 新手 请耐心等待 我一直在浏览 Tour of Go 页面 无意中发现了一些关于 Stringers 的令人费解的事情 考虑以下练习 https tour golang org methods 18 我最初的答案是实施 func th
  • 使用 React 更新 HTML5 视频上的源 URL

    我想更新 HTML5 视频元素中的源标签 以便当我单击按钮时 正在播放的任何内容都会切换到新视频 我有一个 Clip 组件 它返回一个 HTML5 视频元素 并通过 props 提供源 URL function Clip props ret
  • 使用jquery在密码字段中进行密码屏蔽

    如何在 Android 手机中进行密码屏蔽 例如当我们输入一个键时 它会显示一个键几秒钟并将其更改为 我尝试了中提到的插件使用js在手机中进行密码屏蔽这不是最佳的 还有 jsfiddlehttp jsfiddle net medopal X
  • 如何使用 RSpec 测试 STDIN

    好的 需要帮助进行测试 我想测试这个类是否收到字母 O 并且 当调用 move computer 方法时 会返回用户在 cli 上输入的内容 我的心理子处理器告诉我 这是一个简单的分配变量来保存 STDIN 上的随机人类输入 只是现在不明白
  • SQL Server 2012 中具有列和行总计的动态数据透视表

    我有表 RPT DailySalesSummary 其中包含 CalDate OrderID SalesAmount LocRecID 列 CalDate OrderID SalesAmount LocRecID 2016 12 01 R1
  • 在视图控制器segue之间传递数据[重复]

    这个问题在这里已经有答案了 我的第一个视图控制器 AllAthletes 是我所有核心数据实体的 uitableview 它在字幕样式表格单元格中显示实体 运动员 及其属性 例如名字等 当您单击视图单元格时 我希望此视图控制器传递所选实体的
  • 使整个应用程序可以访问数据(可能在运行时发生变化)的最佳方法是什么?

    在整个应用程序中访问数据的最佳方式是什么 在我的具体示例中 我将应用程序的设置从 XML 文件加载到 Settings Object 的实例中 并且我不想将这些设置为绝对常量 因为用户应该能够更改这些设置 并查看效果 无需重新启动程序 现在
  • 如何在 Javascript 中检索基数 trie 中的所有数据/单词

    我已经能够用 JavaScript 编写一个基数树示例 未优化 所以不要评判 到目前为止我已经能够Add Transverse and Find nodes 我在编写一个可以的函数时遇到问题retrieve所有节点 这是我需要帮助的地方 预
  • Appcelerator 找不到方法 android.app.Activity.checkSelfPermission

    我似乎无法在 Android 上使用地理位置 只是出现以下错误 INFO dalvikvm Could not find method android app Activity checkSelfPermission referenced
  • Eval() 如果为 null,则显示自定义值

    td td
  • Mongoose 预保存钩子正在触发,但不保存附加字段(不使用 model.update)

    我正在尝试在我的架构中实现一个计数器来获取下一个问题编号 我已将其实现为 Mongoose 中的钩子预保存钩子 一切看起来都很好 除了实际的 数字 字段没有更新 我可以很容易地通过控制台记录的内容判断钩子正在触发 甚至该字段似乎已被分配 但