0

I'm relatively new to MEAN/Mongoose/socket.io and am missing something that seems like it'd be basic, but regardless, it's keeping me from moving forward.

I'm keeping track of a group's meetings and have the following Schema:

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var ScheduleSchema = new Schema({
  description: String,
  meetingPlace: String,
  office: String,
  start: { type: Date, default: Date.now },
  end: { type: Date, default: Date.now },
  participants: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  author: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  },
  timestamp: { type: Date, default: Date.now },
  active: Boolean
});

ScheduleSchema.statics = {
  load: function(cb) {
    this.find({})
      .populate({path:'participants'})
      .exec(cb);
  }
};

module.exports = mongoose.model('Schedule', ScheduleSchema);

When I create a new item in the Schedule model, this code sets it in motion (from a client-side controller):

$http.post('/api/schedules', { description: info.description, participants: attendees, meetingPlace: info.meetingPlace, office: info.office, start: info.start, end: info.end, timestamp: new Date(), active: true });

And because of this code:

'use strict';

var express = require('express');
var controller = require('./schedule.controller');

var router = express.Router();

router.get('/', controller.index);
router.get('/:id', controller.show);
router.post('/', controller.create);
router.put('/:id', controller.update);
router.patch('/:id', controller.update);
router.delete('/:id', controller.destroy);

module.exports = router;

I think the request is being routed to controller.create, which is the following:

'use strict';

var _ = require('lodash');
var Schedule = require('./schedule.model');

// Get list of schedules
exports.index = function(req, res) {
  Schedule.load(function (err, schedules) { /*.find*/
    if(err) { return handleError(res, err); }
    return res.json(200, schedules);
  });
};

// Get a single schedule
exports.show = function(req, res) {
  Schedule.findById(req.params.id, function (err, schedule) {
    if(err) { return handleError(res, err); }
    if(!schedule) { return res.send(404); }
    return res.json(schedule);
  });
};

// Creates a new schedule in the DB.
exports.create = function(req, res) {
  var promise = Schedule.create(req.body, function(err, schedule) {
    if(err) { return handleError(res, err); }
    return res.json(201, schedule);
  });
};

// Updates an existing schedule in the DB.
exports.update = function(req, res){
  var updatedMeeting = req.body;
  var id = updatedMeeting._id;
  delete updatedMeeting._id;
  Schedule.update({_id : id}, updatedMeeting, { }, function (err, numberAffected, raw) {
    if (err) return res.json(500, err);
    updatedMeeting._id = id;
    return res.json(201, updatedMeeting);
  });
};

// Deletes a schedule from the DB.
exports.destroy = function(req, res) {
  Schedule.findById(req.params.id, function (err, schedule) {
    if(err) { return handleError(res, err); }
    if(!schedule) { return res.send(404); }
    schedule.remove(function(err) {
      if(err) { return handleError(res, err); }
      return res.send(204);
    });
  });
};

function handleError(res, err) {
  return res.send(500, err);
}

After exports.create is run, and I don't know how, but something sends it over to here:

'use strict';

var Schedule = require('./schedule.model');

exports.register = function(socket) {
  Schedule.schema.post('save', function (doc) {
    onSave(socket, doc);
  });
  Schedule.schema.post('remove', function (doc) {
    onRemove(socket, doc);
  });
  Schedule.schema.post('update', function (doc) {
    onUpdate(socket, doc);
  });
}

function onSave(socket, doc, cb) {
  console.log('**********onSave**********');
  Schedule
    .findOne({ _id : doc._id })
    .populate('participants')
    .exec(function (err, event) {
      if (err) return handleError(err);
      socket.emit('schedule:save', event);
    });
}

function onRemove(socket, doc, cb) {
  socket.emit('schedule:remove', doc);
}

function onUpdate(socket, doc, cb) {
  console.log('**********onUpdate**********');
  socket.emit('schedule:update', doc);
}

and the line socket.emit('schedule:save', event); is called.

So that's all great, but when I update the Schedule model, I can't get socket to emit 'schedule:update' because it never gets to the "onUpdate" function in the code snippet just above this.

Starting from the client-side call:

$http.patch('/api/schedules/' + info._id, { _id: info._id, description: info.description, participants: attendees, meetingPlace: info.meetingPlace, office: info.office, start: info.start, end: info.end, timestamp: new Date(), active: true });

and the router sends that to exports.update, the model is updated, but socket doesn't emit anything, so all the clients connected see the old schedule information.

How and where can I relay to socket.io that the model has been updated? I think what I'm missing is how Schedule.schema.post('some action... gets called within the exports.register function, but I've been looking at this for a while and could use a hand - thanks.

ZachO
  • 68
  • 9
  • I don't consider this an answer, but if anyone were to come across this looking for an interim workaround... I was able to change the exports.update function to get it looking like it's working. I did this by taking the code in exports.remove, saving the _id before removing, then inserting the code for exports.add (with the same _id), so the exports.update function ended up looking like this: – ZachO Feb 19 '15 at 16:20
  • `exports.update = function(req, res){ var updatedMeeting = req.body; Schedule.findById(req.params.id, function (err, oldMeeting) { if(err) { return handleError(res, err); } if(!oldMeeting) { return res.send(404); } oldMeeting.remove(function(err) { if(err) { return handleError(res, err); } var promise = Schedule.create(updatedMeeting, function(err, schedule) { if(err) { return handleError(res, err); } return res.json(201, schedule); }); }); }); };` – ZachO Feb 19 '15 at 16:31

0 Answers0