Express 如何让socket.io在模型更新时识别
我对MEAN/Mongoose/socket.io比较陌生,我缺少了一些基本的东西,但不管怎样,这让我无法前进 我正在跟踪一个小组的会议,并具有以下模式:Express 如何让socket.io在模型更新时识别,express,mongoose,socket.io,mean-stack,angular-fullstack,Express,Mongoose,Socket.io,Mean Stack,Angular Fullstack,我对MEAN/Mongoose/socket.io比较陌生,我缺少了一些基本的东西,但不管怎样,这让我无法前进 我正在跟踪一个小组的会议,并具有以下模式: 'use strict'; var mongoose = require('mongoose'), Schema = mongoose.Schema; var ScheduleSchema = new Schema({ description: String, meetingPlace: String, office:
'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);
在明细表模型中创建新项时,此代码将其设置为运动(从客户端控制器):
由于这一准则:
'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;
我认为请求正在路由到controller.create,如下所示:
'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);
}
exports.create运行后,我不知道如何运行,但有东西将其发送到这里:
'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);
}
以及行socket.emit('schedule:save',event');被称为
这很好,但是当我更新调度模型时,我不能让套接字发出“Schedule:update”,因为它永远不会到达上面代码段中的“onUpdate”函数
从客户端调用开始:
$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 });
路由器将其发送到exports.update,模型已更新,但套接字不会发出任何消息,因此所有连接的客户端都会看到旧的计划信息
如何以及在何处向socket.io中继模型已更新?我想我缺少的是如何Schedule.schema.post(一些动作……在ExpSt.Stand函数中被调用,但是我已经看了一会儿,并且可以用一只手。谢谢。我不认为这是一个答案,但是如果有人遇到这个问题,寻找一个临时的解决办法……我就可以改变ExpExt.Upx函数,让它看起来像是在工作。我这样做了。通过在exports.remove中获取代码,在删除之前保存_id,然后插入exports.add的代码(使用相同的_id),exports.update函数最终看起来是这样的:
exports.update=function(req,res){var updatemeeting=req.body;Schedule.findById(req.params.id,function(err,oldmeting){(err){return handleError(res,err);}if(!oldMeeting){return res.send(404);}oldMeeting.remove(函数(err){if(err){return handleError(res,err);}var promise=Schedule.create(updatedMeeting,函数(err,Schedule){(if(err){){return handleError(res,err);}return res.json(201,Schedule);});});};
$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 });