7

I have a mongoose model that has an association with a user model e.g.

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

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

When I instantiate a new model I do:

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

The model's constructor takes a lot of parameters which has become tedious to write and refactor when the schema changes. Is there way of doing something like:

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

Or is the best way to create a helper method to generate a JSON object or even attach the userId to the request body? Or is there way that I haven't even thought of?

Clive
  • 405
  • 2
  • 5
  • 12

3 Answers3

7
_ = require("underscore")

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

or if you want to copy userId into req.body:

var model = new Example(_.extend(req.body, { userId: req.user._id }))
Jean-Philippe Leclerc
  • 6,713
  • 5
  • 43
  • 66
4

If I understood you correctly, you'll be good trying the following:

// 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 );

Also, do not forget to add in your Schema options { strict: true }, otherwise you may be saving unwanted/attackers data.

gustavohenke
  • 40,997
  • 14
  • 121
  • 129
0

Since Node 8.3, you can also use Object Spread syntax.

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

Note that order matters, with later values overriding previous ones.

krotscheck
  • 91
  • 1
  • 6