Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose - pushing refs - cannot read property "push" of undefined

I would like to add a category and then if successed, push it's ref to user' collection. That's how I'm doing this:

That's mine "dashboard.js" file which contains categories schema.

var users = require('./users');

var category = mongoose.model('categories', new mongoose.Schema({
    _id:     String,
    name:    String,
    ownerId: { type: String, ref: 'users' }
}));

router.post('/settings/addCategory', function(req, res, next) {
  console.log(req.body);
  var category_toAdd = new category();
  category_toAdd._id = mongoose.Types.ObjectId();
  category_toAdd.name = req.body.categoryName;
  category_toAdd.ownerId = req.body.ownerId;

  category.findOne({
    name: req.body.categoryName,
    ownerId: req.body.ownerId
  }, function(error, result) {
     if(error) console.log(error);
     else {
       if(result === null) {
         category_toAdd.save(function(error) {
           if(error) console.log(error);
           else {
             console.log("Added category: " + category_toAdd);
<<<<<<<<<<<<<<<<<<<THE CONSOLE LOG WORKS GOOD
             users.categories.push(category_toAdd);
           }
         });
       }
     }
  });

Here is my "users.js" file which contains "users" schema.

var categories = require('./dashboard');

var user = mongoose.model('users', new mongoose.Schema({
    _id:          String,
    login:        String,
    password:     String,
    email:        String,
    categories:   [{ type: String, ref: 'categories' }]
}));

So, the category add proccess works well and I can find the category in database. The problem is when I'm trying to push the category to user.

This line:

users.categories.push(category_toAdd);

I get this error:

Cannot read property "push" of undefined.

I need to admit once more that before that pushing there is console.log where the category is printed properly.

Thanks for your time.

like image 761
elzoy Avatar asked Jan 17 '16 12:01

elzoy


1 Answers

The users object is a Mongoose model and not an instance of it. You need the correct instance of the users model to add the category to.

dashboard.js

...
category_toAdd = {
  _id: mongoose.Types.ObjectId(),
  name: req.body.categoryName,
  ownerId: req.body.ownerId
};

// Create the category here. `category` is the saved category.
category.create(category_toAdd, function (err, category) {
  if (err) console.log(err);

  // Find the `user` that owns the category.
  users.findOne(category.ownerId, function (err, user) {
    if (err) console.log(err);

    // Add the category to the user's `categories` array.
    user.categories.push(category);
  });
});
like image 81
gnerkus Avatar answered Sep 22 '22 18:09

gnerkus