Теперь я пытаюсь использовать socket.io и angularJS для написания программы чата, базовая настройка - это одно "задание", в котором есть два "чата", частный и публичный.
В настоящее время я могу опубликовать новое сообщение, сохранить его в базе данных (mongodb) и отобразить новое сообщение на веб-странице, обновив (используя некоторые вещи angularJS).
Однако, после добавления некоторых кодов socket.io, новое сообщение по-прежнему невозможно отобразить в реальном времени, я совершенно не понимаю, почему?
Вот ссылка, которую я использую: https://www.youtube.com/watch?v=kyPiJEVQ6cU
Вот соответствующие коды, которые я написал:
дБ/модель/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);
}
});
};
общественные /JS/услуги /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);
}
});
});
}
};
}]);
общественные /JS/Контроллеры/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
}
маршруты/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
}
}
});
});
общественности/просмотров/обертоны/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 или с моделью сообщений/чатов?
Любой ответ будет оценен. Спасибо!
Здесь есть опечатка:
io.emit = ('news',...
Должен быть:
io.emit ('news',...