Mongoose ODM,保存前更改变量
Posted
技术标签:
【中文标题】Mongoose ODM,保存前更改变量【英文标题】:Mongoose ODM, change variables before saving 【发布时间】:2012-07-04 17:43:25 【问题描述】:我想用 Mongoose 为我的用户文档创建一个模型层,这样做:
-
验证(唯一,长度)
规范化(用户名和电子邮件转换为小写以检查唯一性)
盐生成
密码散列
(记录)
所有这些操作都需要在持久化到数据库之前执行。幸运的是 mongoose 支持验证、插件和中间件。
不好的是我找不到任何关于这个主题的好材料。 mongoosejs.com 上的官方文档太短了……
有没有人有关于 Mongoose 预操作的示例(或者一个完整的插件,如果它存在的话)?
问候
【问题讨论】:
我认为 mongoosejs.com 上的文档在这方面非常清楚。您尝试过哪些不起作用的方法? 验证部分很清楚,但在一些持久化之前不知道如何准备对象。我认为 Schema.pre('save', callback);函数可能是它,但缺少完整的示例我也不知道如何访问前函数中对象的属性 您在中间件函数中通过this
访问文档的属性。
你能把这个复制到答案中,这样我就可以标记问题已回答:)
【参考方案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()
之前对其进行的修改会改变保存的内容。
【讨论】:
以上是关于Mongoose ODM,保存前更改变量的主要内容,如果未能解决你的问题,请参考以下文章
尝试将变量保存到 GeoJSON 点时出现 Mongoose CastError