【问题标题】:How do I make socket.io + ejs + mongoose work properly?如何使 socket.io + ejs + mongoose 正常工作?
【发布时间】:2016-02-21 22:36:39
【问题描述】:

我的目标是每当有人按下接受按钮时,它会自动增加导航栏上的通知。

逻辑

1) 管理员按下接受按钮

2) 用户的导航栏将监听通知事件并增加计数并将消息附加到 li 元素。

这是我希望 socket.io 更新的通知图片

但是我没有看到任何实时更新

这是代码

socket.io 客户端

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script>
  var socket = io.connect('http://localhost:3000');
  $('form').submit(function(){
    var companyName = $("#companyName").val();
    var notification = "Accepted by " + companyName;
    var user_id = $('#candidate_id').val();
    var notificationCount = parseInt($('#notification').html());
    noticationCount += 1;
    socket.emit('notify', {notification: notification, userId: user_id, count: notificationCount});
  });
  socket.on('notify', function(msg){
    $('#notification').html(msg.count);
    $('#addNotification').append($('<li>').text(msg.notification));
  });
</script>

HTML (EJS) 代码 -- 这是它应该更新的地方。

<li class="dropdown notifications-menu">

            <span id='notification' class="label label-warning"><%= user.notifications.length %></span>
          </a>
          <ul class="dropdown-menu">

            <li>

              <ul class="menu" id="addNotification">
                <% for(var i=0; i < user.notifications.length; i++)  { %>
                <li><!-- start notification -->
                  <a href="#">
                    <i class="fa fa-users text-aqua"></i> <%= user.notifications[i] %>
                  </a>
                </li>
                <% } %>
              </ul>
            </li>

          </ul>
        </li>

服务器端

io.on('connection', function(socket){
  socket.on('notify', function(msg){

      User.findById({ _id: msg.userId}, function(err, found) {
        if (typeof found === 'undefined') {
          // Do something but what should I do?s
        } else {
          found.notifications.push(msg.notification);
          found.save(function(err) {
            console.log(msg.notification); // Doesnt even console.log the data.

          });
        }
      });
  });
});

我的目标还是

1) 有人提交一个按钮,它将根据其tag's id 发出所有隐藏的输入值,如id="user_id"

2) socket.on('notify') --> 将通过目标html标签的id实时监听和更新

3) 将数据保存在数据库中。

但是上面的实现,我必须刷新它才能看到结果。 但是如果我将此行添加到 socket.io 客户端代码

var notificationCount = parseInt($('#notification').html());
        noticationCount += 1;

它甚至不会将其保存到数据库中,而在其他地方实时更新它。我

请把你的实时知识借给我:)

【问题讨论】:

    标签: node.js socket.io ejs socket.io-1.0


    【解决方案1】:

    1) 你不应该包含来自 cdn 的 socket.js 文件,它应该像这样加载

    &lt;script src="http://localhost:3000/socket.io/socket.io.js"&gt;&lt;/script&gt;

    你不需要将socket.io.js文件保存在项目文件夹的任何地方,这是由socket.io模块处理的

    2) 我看到代码将客户端消息接收到服务器,而不是从那里返回到客户端。它看起来像这样(用于广播)

    io.on('connection', function(socket){ socket.on('notify', function(msg){ // pass notification & count to client io.emit('notify', {notification:msg.notification, count:your_msg_count}); ....

    我不会深入研究您的代码,希望这能解决您的问题。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 2018-04-26
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2016-11-26
      相关资源
      最近更新 更多