【发布时间】:2015-07-10 16:15:50
【问题描述】:
我现在正在尝试用socket.io和angularJS写一个聊天程序,基本设置是一个“job”有两个“chat”,一个私人的和公共的。
目前,我可以发布一条新消息,将其存储在数据库中(mongodb)并通过刷新(使用一些 angularJS 的东西)将新消息显示到网页上。
但是,添加了一些socket.io代码后,新消息仍然无法实时显示,我完全不知道为什么?
这是我正在使用的参考: https://www.youtube.com/watch?v=kyPiJEVQ6cU
这是我写的相关代码:
db/models/chat.js
var chatSchema = new mongoose.Schema({
chatType: String,
messages: [{
text: String,
time: {type: Date, default: Date.now},
user: {type: mongoose.Schema.Types.ObjectId, ref: 'User'}
}]
});
chatSchema.methods.addMessage = function(UserID, Text) {
var message = {
text: Text,
user: UserID
};
this.messages.push(message);
this.save(function(err) {
if (err) {
return (err);
}
});
};
public/js/services/ChatService.js
...
.factory ('socketio', ['$rootScope', function($rootScope){
var socket = io.connect();
return {
on: function(eventName, callback){
socket.on(eventName, function(){
var args = arguments;
$rootScope.$apply(function(){
callback.apply(socket, args);
});
});
},
emit: function(eventName, data, callback){
socket.emit(eventName, data, function(){
var args = arguments;
$rootScope.$apply(function(){
if (callback){
callback.apply(socket, args);
}
});
});
}
};
}]);
public/js/controllers/ChatController.js
// some more codes here
.controller('ChatController', ['Chat', 'socketio', '$scope', '$routeParams', ChatController]);
function ChatController(Chat, socketio, $scope, $routeParams) {
'use strict';
var vm = this;
vm.urlJobname = $routeParams.jobname;
vm.chatType = $scope.chatType;
// get all history messages
Chat.all(vm.urlJobname, vm.chatType).success(function(data) {
vm.allmessages = data;
});
socketio.on('news', function(data) {
vm.allmessages.push(data);
});
// some more codes here
}
routes/api/chat.js
api.post('/jobs/:jobname/chats/:chatType', function(req, res) {
Job
.findOne({
jobname: req.params.jobname
})
.populate('privateChat publicChat')
.exec(function(err, job) {
if (err) {
res.send(err);
return;
}
if (!job) {
res.status(404).send({
success: false,
message: "job not found"
});
} else {
if (req.params.chatType == "privateChat") {
if (req.body.text) {
job.privateChat.addMessage(req.decoded.id, req.body.text);
io.emit = ('news',
{
text: "Welcome to private chat",
user: {
username: "John",
firstName: "John",
lastName: "Smith"
},
time: "2015-06-25T16:21:05.862Z"
}
);
res.json({
success: true,
message: 'new message is posted!'
});
} else {
res.json({
success: false,
message: 'please type your message'
});
}
} else if (req.params.chatType == "publicChat") {
//the same as public chat
} else {
// some more codes here
}
}
});
});
public/views/partials/chat.html
<div class="row msg-container" ng-repeat="message in chatCtrl.allmessages">
<div class="col-md-12 col-xs-12">
<strong class="chat-msg-author">{{message.user.firstName}} {{message.user.lastName}}</strong>
<p>{{message.text}}</p>
<p>{{message.time}}</p>
</div>
</div>
我猜问题出在 .on 和 .emit 方法上,还是消息/聊天模型上?
任何回复将不胜感激。谢谢!
【问题讨论】:
-
你可以试试
var socket = io();而不是var socket = io.connect(); -
@Plato 谢谢你,是的,我刚才试过了,但还是一样。
-
bug 已修复,请查看我的更新。 @柏拉图
标签: angularjs node.js mongodb socket.io