简体   繁体   English

如何将姓名添加到 socket.io 聊天

[英]How to add names to socket.io chat

I'm new to socket.io. I have a working message chat set up and I'm trying to add names to the messages.我是 socket.io 的新用户。我设置了一个有效的消息聊天,我正在尝试为消息添加名称。 I have a var called name which holds each users name who has logged in. below is the code.我有一个名为name的 var,它包含每个已登录的用户名。下面是代码。

On the HTML page that holds the chat.在聊天的 HTML 页面上。 chat-room.html聊天室.html

const room = 'waiting';
      const socket = io('/tech');
      $('form').submit(() => {
        let msg = $('#m').val();
        socket.emit('message', { msg, room });
        $('#m').val('');
        return false;
      });

      socket.on('connect', () => {
        // emiting to everybody
        socket.emit('join', { room: room });
      })

      socket.on('message', (msg) => {
        $('#messages').append($('<li>').text(name + msg));
      })

On the server script.在服务器脚本上。 index.js索引.js

const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const port = 3001;

server.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/virtualsim/learning/chat-room.html');
});

app.get('/trainees', (req, res) => {
    res.sendFile(__dirname + '/virtualsim/learning/chat-room2.html');
});

const tech = io.of('/tech');

tech.on('connection', (socket) => {
    socket.on('join', (data) => {
        socket.join(data.room);
        tech.in(data.room).emit('message', `joined ${data.room} room!`);
    })

    socket.on('message', (data) => {
        console.log(`message: ${data.msg}`);
        tech.in(data.room).emit('message', data.msg);
    });
    
    socket.on('disconnect', () => {
        console.log('user disconnected');

        tech.emit('message', 'user disconnected');
    })
})

Obvious, the way I have it now just sends back the user his or her name for every message sent, even messages send by other users.很明显,我现在使用的方式只是将用户发送的每条消息的姓名发回给用户,即使是其他用户发送的消息。 I need to add the variable name to the server script some how and I'm having difficulties getting it to work.我需要以某种方式将变量添加到服务器脚本中,但我很难让它工作。 Thanks for any help.谢谢你的帮助。 John约翰

Here is my Frontend code for set the username这是我设置用户名的前端代码

     <script>
     const form = document.querySelector("form");
     const input = document.querySelector(".input");
     const messages = document.querySelector(".messages");
     const username = prompt("Please enter a username: ", "");
     const socket = io();

     socket.on("old_message", {message: "hello"});

     form.addEventListener("submit", function(event) {
        event.preventDefault();

     addMessage(username + ": " + input.value);
     socket.emit("chat_message", {
        message: input.value
     });
  
     input.value = "";
     return false;
  }, false);

  socket.on("chat_message", function(data) {
    addMessage(data.username + ": " + data.message);
  });

  socket.on("user_join", function(data) {
    addMessage(data + " just joined the chat!");

  });

  socket.on("user_leave", function(data) {
    addMessage(data + " has left the chat.");
  });

  socket.on("old_message", function() {
      console.log('----data', data);
  });

  socket.on("getList", function(data) {
      console.log('----MessageList', data);
  });

  addMessage("You have joined the chat as '" + username  + "'.");
  socket.emit("user_join", username);
  socket.emit("old_message")

function addMessage(message) {
  const li = document.createElement("li");
  li.innerHTML = message;
  messages.appendChild(li);
  window.scrollTo(0, document.body.scrollHeight);
}
Here is backend code 

    const users = []; io.on('connection', (socket) => {   socket.on('user_join', (data) => {
    this.username = data;
    // here check in DB with sender, receiver if record not exist then create
    users.push({
      socketId: socket.id,
      userId: data,
    });
    socket.broadcast.emit('user_join', data);   });

  socket.on('chat_message', async (data) => {
    const a = {
      sender: data.senderId,
      receiver: data.receiverId,
      type: 'TEXT',
      message: data.message,
    };
    await model.conversations.create(a);    
    data.username = this.username;
    socket.broadcast.emit('chat_message', data);   });

  socket.on('disconnect', (data) => {
    socket.broadcast.emit('user_leave', this.username);   });

  socket.on('old_message', async (data) => {
    const messageList = await model.conversations.findAll({
      where: {
        sender: data.senderId,
        receiver: data.receiverId,
      },
    });
    socket.broadcast.emit('getList', messageList);   }); });

Thanks for the answers back.感谢回复。 I have figured out what I had to do.我已经弄清楚我必须做什么了。

First (on the HTML page) I had to emit the var name which holds all the users names to the server script on connect.首先(在 HTML 页面上)我必须在连接时将包含所有用户名的 var 名称发送到服务器脚本。 This gives the proper name when one enters the room.当一个人进入房间时,这会给出正确的名字。

socket.on('connect', () => {
        socket.emit('join', { room: room, name: name });      
      })

Then I added it to the messages being sent然后我将它添加到正在发送的消息中

 $('form').submit(() => {
        let msg = $('#m').val();
        socket.emit('message', { name, msg, room });
        $('#m').val('');
        return false;
      });

Then on the server script I added.然后在我添加的服务器脚本上。

On connect在连接

tech.in(data.room).emit('message', `${data.name} joined ${data.room} room!`);

Then again for the messages being sent然后再次发送消息

tech.in(data.room).emit('message', data.name + data.msg);

I'm sure there is a better way to join the names and messages but like I said I'm new to socket and I have spent way too much time on this:) If you know a better way please do let me know.我确信有更好的方法来加入名称和消息,但就像我说的,我是套接字的新手,我在这上面花了太多时间:) 如果你知道更好的方法,请告诉我。 Thanks!谢谢!

prompt for the name first, then append it to the start of every message they emit首先提示输入名称,然后是 append 到他们emit的每条消息的开头

socket.emit(name+msg, ()=>{...});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM