我正在尝试使用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模型生成,对吧?
答案 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是否更好。