SocketIO发出功能记录,但无法正常工作

时间:2018-11-30 10:15:43

标签: 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>`);

时间戳工作正常,并且对上面的代码行没有其他直接更改,它停止工作,或者仅在刷新页面后工作。控制台记录“消息已保存”,但是我在客户端空间中遇到Uncaught TypeError:无法读取未定义的属性“ slice”。但这只是问题之一,而不是一个问题。

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

我只有一个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> `);
        });

所以为什么我的离开消息不起作用,它看起来像我在套接字中所做的所有事情。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分配给用户名,因此它表示user [username]已加入/退出了聊天。但是首先是第一件事。感谢您的浏览。

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

1 个答案:

答案 0 :(得分:0)

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

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(前端代码是可以的,由于文档不完善和版本更改很多,很难掌握此信息,只是习惯于检查控制台。这仍然是一个非常好的框架,不确定当前的websocket是否更好。