javascript - SocketIO 发出函数记录但不能正常工作

标签 javascript jquery socket.io chat

我正在尝试使用 socketIO、express、mongoDB 制作一个基本的聊天应用程序,一切正常。

我想要的功能是,添加最新的消息并将消息 div 滚动到底部,这有效。

附加消息的格式如下:

 $("#textdiv").append(` <li class='blueText'> <img src="//unsplash.it/50/50"/> ${message.name} </li>  <p class='blueText'> ${message.message} </p> <span class='blueText'>Posted on: ${message.time.slice(0, 10) } <span class='spacial'> at: ${message.time.slice(11, 19) }</span> </span>`);

时间戳工作正常,并且没有对上述代码行进行其他直接更改,它停止工作,或者仅在页面刷新后工作。控制台记录“消息已保存”,但我在客户端 cosnole 中收到 Uncaught TypeError: Cannot read property 'slice' of undefined。但这只是其中一个问题,而不是另一个问题。

我的目标是在用户加入或离开聊天室时显示一条消息。

我只有一个 server.js 和一个 index.html 文件。

这是来自 server.js 文件的相关 IO JS:

io.on('connection', (socket) =>{
console.log('a user is connected', socket.id); // works
socket.emit('newEntry', { userID: socket.id, // works and is displayed on the front end and console
 description: 'Has joined the chat room!'
});
setTimeout(function() {  // works
socket.emit('testerEvent', { description: 'A custom event named 
testerEvent!'});
}, 4000);

socket.on('clientEvent', function(data) {  // works
  console.log(data);
// here the troubles start
socket.on('disconnect', function(){
console.log('user disconnected', socket.id); // this works 
socket.emit('leaving', { userID: socket.id, // this does not work, is logged on sevrer console, but nothing on client, no error
  description: 'Has left the chat room!'
});
});
})
});

index.html中对应的代码是:

 var socket = io(); // init

 socket.emit('clientEvent', 'Sent an event from the client!'); // works
  $(() => { // works
      $("#send").click(()=>{
          sendMessage({name: $("#name").val(), message: 
  $("#message").val()});
      })
      getMessages();

  })
  socket.on('message', addMessages)
  socket.on('testerEvent', function(data){ // works
  console.log(data);

  $("#textdiv").append(` <li class='blueText'> ${data.description} </li> `);
    });
    // this does  not work, its looged on the server side console but nothing happens on client
    socket.on('leaving', function(data){
    console.log(data);

   $("#textdiv").append(` <li class='greenText'> User ${data.userID}  
   ${data.description} </li> `);
      });
    //the following does work, it should append the text to the last message but I can sort that out later.
      socket.on('newEntry', function(data){
      console.log(data);

     $("#textdiv").append(` <li class='blueText'> User ${data.userID}  
     ${data.description} </li> `);
        });

那么为什么我的留言不起作用,看起来我在 socket.on('disconnect', function(){ 部分中所做的一切都不起作用。

当我从以下模型获取时间戳时尝试使用 slice 时出现前面提到的错误,我该如何更改它?我只想让聊天显示“在 [时间] [日期] 发布”。

在server,js中定义模型:

var Message = mongoose.model('Message',{
name : String,
message : String,
time : { type : Date, default: Date.now }
 })

最后一件事,我如何清除控制台,每当我在 localhost 3000 上重新启动浏览器时,所有旧消息都会显示并重新呈现,即使在新选项卡中,我该如何停止,这非常繁琐等待所有以前的消息加载,尤其是像我这样容易出错的代码(原谅我,我是服务器端的新手,但我喜欢它:-))。

github 存储库:https://github.com/dampopgit/nodejsChat

代码比看起来要小,感谢所有帮助。

Localhost3000 和入口点 nodemon ./server.js

我知道这是一个半问题,但我主要想知道我在 server.js 的 socket.on('disconnect', function(){} 部分中做错了什么。

接下来的事情是如何将生成的 ID 分配给用户名,因此它显示用户 [用户名] 已加入/离开聊天。但首先是第一件事。感谢您的观看。

我还注意到除了最后一条之外的每条聊天消息都有相同的时间戳,这很糟糕。为什么会这样。看起来整个时间戳可能不应该从 mongoDBs 模型中生成,对吧?

最佳答案

我一个人解决了,问题很多。

var Message = mongoose.model('Message',{
name : String,
message : String,
time : { type : Date, default: Date.now }
})

我没有将日期保存到 mongoDB 而没有得到正确的时间戳,如果我使用任何字符串方法也没有得到未定义的值,我只是这样做了

var fullDate = new Date($.now()).toString();
var datePartialTime = fullDate.slice(16, 25);
var datePartialDate = fullDate.slice(0, 16);

这是在用户离开聊天时获取消息和弹出窗口的正确代码

socket.on('disconnect', function(){
console.log('user disconnected', socket.id);
if (socket.username == undefined) {
  io.sockets.emit('leaving', { userID: "who values privacy",
    description: 'Has left the chat room!'
});
}

else{
  io.sockets.emit('leaving', { userID: socket.username,
  description: 'Has left the chat room!'

});

io.sockets.emit 而不是 socket.on(前端代码还可以,很难掌握这些信息,由于文档不完善和版本变化很多,只是习惯于检查 socket 对象中的控制台。仍然是一个非常好的框架,不确定现在原生 websockets 是否更好。

关于javascript - SocketIO 发出函数记录但不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53555439/

相关文章:

java - javascript 函数中的表单操作不起作用

javascript - 如何让此 JavaScript/moment 代码适用于美国和英国日期格式?

javascript - JQuery DataTables 元素显示并切换,但排序根本不起作用?

javascript - 仅针对 jquery ui slider 的特定值做一些非凡的事情

javascript - 如何为浏览器客户端设置 RabbitMQ 绑定(bind)?

go - 使用 Golang 通过 Socket.io 传输音频

javascript - 我在将 indexOf 转换为 for 循环时遇到问题,因此我得到了错误的答案

javascript - 跳过字符串中的空格

node.js - Socket.io 服务器发出不触发

javascript - 替换整个 div 而不是 div 内容