7

我有一个与用户模型相关联的猫鼬模型,例如

var exampleSchema = mongoose.Schema({
   name: String,
   <some more fields>
   userId: { type:mongoose.Schema.Types.ObjectId, ref: 'User' }
});

var Example = mongoose.model('Example', userSchema)

当我实例化一个新模型时,我会:

// the user json object is populated by some middleware 
var model = new Example({ name: 'example', .... , userId: req.user._id });

模型的构造函数需要很多参数,当模式发生变化时,这些参数的编写和重构变得乏味。有没有办法做类似的事情:

var model = new Example(req.body, { userId: req.user._id });

或者是创建辅助方法以生成 JSON 对象甚至将 userId 附加到请求正文的最佳方法?或者有没有我什至没有想到的方法?

4

3 回答 3

7
_ = require("underscore")

var model = new Example(_.extend({ userId: req.user._id }, req.body))

或者如果你想将 userId 复制到 req.body 中:

var model = new Example(_.extend(req.body, { userId: req.user._id }))
于 2013-02-19T14:04:00.617 回答
4

如果我理解正确,你会很好地尝试以下方法:

// We "copy" the request body to not modify the original one
var example = Object.create( req.body );

// Now we add to this the user id
example.userId = req.user._id;

// And finally...
var model = new Example( example );

另外,不要忘记添加您的架构选项 { strict: true },否则您可能会保存不需要的/攻击者数据。

于 2013-02-19T14:04:17.337 回答
0

从 Node 8.3 开始,您还可以使用Object Spread 语法

var model = new Example({ ...req.body, userId: req.user._id });

请注意,顺序很重要,后面的值会覆盖前面的值。

于 2020-09-21T22:10:03.267 回答