为什么数据对象具有data.username字段

时间:2018-12-22 12:21:57

标签: jquery node.js socket.io chat

我正在尝试学习如何使用socket.ioejsnodejs ...

创建聊天应用

所以我基本上是在以下回购中研究代码:https://github.com/ngrt/simpleChatApp

文件夹结构类似于
simpleChatApp(父文件夹)
    -views(包含index.ejs
    -public(包含style.csschat.js)     -app.js(具有服务器代码的文件)

app.js具有app.use(express.static('public')),因此公共作品是root

现在问题出在chat.js(其中包含客户端后端)中
下面的图片是chat.js的一部分

enter image description here

send_message.click(function(){
        socket.emit('new_message', {message : message.val()})
    })

    //Listen on new_message
    socket.on("new_message", (data) => {
        feedback.html('');
        message.val('');
        chatroom.append("<p class='message'>" + data.username + ": " + data.message + "</p>")
    })  

在发射部分,我们仅发送了一个消息字段.....而在套接字部分,我们使用了data.username()...现在,我认为数据基本上是我们发送的对象。 ...其中不包含任何用户名..那么如何使用它..导致其正常工作,因此代码正确..但我不明白为什么

1 个答案:

答案 0 :(得分:1)

客户端socket.on接收到的消息是由nodejs的send发出的(而不是您的代码中客户端的)。这是node js的代码,其中添加了用户名:

socket.on('new_message', (data) => {
  //broadcast the new message
  io.sockets.emit('new_message', {message : data.message, username : socket.username});
})

通常,在您的示例中,多个客户端正在侦听服务器消息,而服务器正在侦听每个客户端的发射。服务器将用户名存储在每个新的socket对象上。连接时的初始值为“匿名”,并在change_username事件中更新:

socket.on('change_username', (data) => {
    socket.username = data.username
})
{p}中的

第一个 send_mesasage emitchat.js received并立即emitted发送给所有已连接的客户端( 包括发件人 )。 服务器为此发射添加用户名(服务器已将其存储在app.js对象中)。

然后,每个客户端receives都会发出此消息(已经有一个用户名)。然后所有{@ 3}}已连接的客户端都会收到消息和用户名