【问题标题】:Mongoose ODM, change variables before savingMongoose ODM,保存前更改变量
【发布时间】:2012-07-04 17:43:25
【问题描述】:

我想用 Mongoose 为我的用户文档创建一个模型层,这样做:

  1. 验证(唯一,长度)
  2. 规范化(用户名和电子邮件转换为小写以检查唯一性)
  3. 盐生成
  4. 密码散列
  5. (记录)

所有这些操作都需要在持久化到数据库之前执行。幸运的是 mongoose 支持验证、插件和中间件。

不好的是我找不到任何关于这个主题的好材料。 mongoosejs.com 上的官方文档太短了……

有没有人有关于 Mongoose 预操作的示例(或者一个完整的插件,如果它存在的话)?

问候

【问题讨论】:

  • 我认为 mongoosejs.com 上的文档在这方面非常清楚。您尝试过哪些不起作用的方法?
  • 验证部分很清楚,但在一些持久化之前不知道如何准备对象。我认为 Schema.pre('save', callback);函数可能是它,但缺少完整的示例我也不知道如何访问前函数中对象的属性
  • 您在中间件函数中通过this 访问文档的属性。
  • 你能把这个复制到答案中,这样我就可以标记问题已回答:)

标签: node.js express mongoose odm


【解决方案1】:

另一种选择是使用 Getter。这是网站上的一个例子:

function toLower (v) {
  return v.toLowerCase();
}

var UserSchema = new Schema({
  email: { type: String, set: toLower } 
});

https://mongoosejs.com/docs/tutorials/getters-setters.html

【讨论】:

  • 值得注意的是,如果您传递的值与指定属性的架构中定义的类型不同,则这是唯一的选择。例如。您有一个 amount 属性,该属性的类型为 number,但您传入用于处理的值是 string
【解决方案2】:
var db = require('mongoose');
var schema = new db.Schema({
  foo:     { type: String }
});

schema.pre('save', function(next) {
  this.foo = 'bar';

  next();
});

db.model('Thing', schema);

【讨论】:

  • 可以注意到,“保存”的 pre 不会在更新时触发。改用“更新”
  • @sasha 你能解释一下你的意思吗
  • @DipanshuMahla 有点,我目前还没有深入研究 mongoose tbh,但我的意思可能是 schema.pre('save') 函数不会触发(或不会触发) t 被执行),当数据被更新时。它可能仅在插入新数据时触发。所以当你想通过 schema.pre() 覆盖更新时,你应该使用'update'
【解决方案3】:

在您的Schema.pre('save', callback) 函数中,this 是要保存的文档,在调用 next() 之前对其进行的修改会改变保存的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2019-12-17
    • 2015-02-09
    • 2012-02-21
    • 1970-01-01
    • 2019-08-23
    相关资源
    最近更新 更多