SocketIO发出函数日志,但无法正常工作



我正在尝试用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:无法读取未定义的属性"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(({part不起作用。

当我从下面的模型中获得时间戳时,当我尝试使用slice时,我会遇到前面提到的错误,我该如何更改?我只想聊天显示"在[日期][时间]发布"。

在服务器js中,定义了模型:

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

最后一件事,我该如何清除控制台,每当我在localhost3000上重新启动浏览器时,所有旧消息都会被显示和重新渲染,即使是在新的选项卡中,我该怎么停止呢,等待所有以前的消息加载是非常乏味的,尤其是像我这样容易出错的代码(请原谅,我对服务器端的东西很陌生,但我喜欢它:-((。

github回购:https://github.com/dampopgit/nodejsChat

代码比看上去要小,我们非常感谢您的帮助。

Localhost3000和入口点nodemon/server.js

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

接下来的事情是如何将生成的ID分配给用户名,这样它就会显示用户[username]已经加入/离开了聊天室。但首先要做的事。谢谢你看。

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

我独自解决了这个问题,问题很多。

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.mit而不是socket.on(前端代码还可以,由于文档不好和版本更改过多,很难掌握这些信息,只需习惯于检查控制台中的socket对象即可。这仍然是一个非常好的框架,不确定本地websocket现在是否更好。

最新更新