【问题标题】:why new message only shows up by refreshing webpage instead of in real time为什么新消息只通过刷新网页而不是实时显示
【发布时间】:2015-07-10 16:15:50
【问题描述】:

我现在正在尝试用socket.ioangularJS写一个聊天程序,基本设置是一个“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


【解决方案1】:

这里有错别字:

io.emit = ('news',...

应该是:

io.emit ('news',...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2013-07-18
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多