每当我发送味精时,它都会在反应中多次显示相同的消息

Pratik Zinjurde

在此处输入图片说明上面的img显示了这个问题。您也可以在右下角检查控制台我正在使用套接字io react节点在一对一聊天网站上工作,表示我正面临此问题,例如:当我键入hi时,hi会显示1次,当我键入hii时,它会显示第2次,当我第三次键入jo时,它将显示jo 3次如何解决此问题,这是我的反应代码。另外,我的消息未在另一端接收,仅在发件人页面上显示

import React, { Component } from 'react';
import { Link,Redirect } from 'react-router-dom';
import UserService from "../services/userservice";
import {getUsersFriend} from "../services/messageservice";
import io from "socket.io-client";
const SOCKET_IO_URL = "http://localhost:4000/";

export default class Messages extends Component {
    constructor(props){
        super(props)
        this.socket = io(SOCKET_IO_URL)
        this.state = {
            currentUser: UserService.getCurrentUser(),
            isLoading:false,
            userdetails:[],
            show:false,
            username:'',
            message:'',
            socketConnected:false,
            messages:[]
        };
        this.onTextboxChangeMessage = this.onTextboxChangeMessage.bind(this)
    }

    componentDidMount(){
        const {currentUser}=this.state
        this.fetchUser()
        this.socket.on('connect',()=> {
            this.setState({ socketConnected : true})
            // console.log("connection")
        })
    }

    async fetchUser(){
        try{
            const {currentUser} = this.state
            console.log(currentUser)
            const data = { userid : currentUser.user._id }
            console.log(data)
            let user = await getUsersFriend(data)
            this.setState({ userdetails: user });
            // console.log(user)
        }catch(err){
            console.log(err)
        }
    }

    showMessageSpace(elementusername){
        this.setState({
            show: true,
            username:elementusername
        });
    }

    onTextboxChangeMessage(e){
        this.setState({ message:e.target.value})
    }

    SendMessage(e,senderid,receiverusername,message,senderusername){
        e.preventDefault();
        e.stopPropagation()
        console.log('event', e)
        const {messages} =this.state
        if(this.state.socketConnected){
            console.log('if condition test',senderid,receiverusername,message,senderusername )
            this.socket.emit('send',{senderid,receiverusername,message,senderusername});
            this.socket.on(`${receiverusername}`, (d)=>{
                if(this.state[`${receiverusername}`]?.length >= 1 ){
                    let messageList = this.state[`${receiverusername}`]
                    this.setState({[`${receiverusername}`]:[...messageList,d]})
                }
                else{
                    this.setState({[`${receiverusername}`]:[d]})
                    console.log('else Condition store individual messages', this.state[`${receiverusername}`])
                }
        }
        this.setState( { message:'' })
    }

    

    render(){
        const { currentUser ,isLoading,userdetails,message,messages} = this.state;
        // console.log(messages)
        if (isLoading) {
            return (<div><p>Loading...</p></div>);
        }

        if(!currentUser){
            return(
                <div>
                    <Redirect  to='/login' />
                </div>
            )
        }
        else{
        return(
            <div>
                <h1>Messages</h1>
                <div>
                    <p>Users</p>
                    {' '}
                    <ul className="collection">
                        {userdetails.map((element) => {
                            return(
                                <div key={element._id}>
                                    <li><Link to={`/dashboard/profile/:${element._id}`}>{element.username}</Link>{' '}<input 
                                    type="button" 
                                    id={element._id}
                                    value="Message"
                                    onClick={this.showMessageSpace.bind(this,element.username)} ></input></li>
                                </div>
                            );
                        })
                        }
                    </ul>
                    {' '}
                </div>
                {' '}
                    <Link to="/dashboard">Dashboard</Link>
                {' '}
                <div>
                {
                    this.state.show &&
                    (<div>
                        <h2>Username : {' '}{this.state.username}</h2>
                        {' '}
                        <div>
                            <h3>Body</h3>
                            <div>
                                <ul>
                                {/* { this.state[`${this.state.username}`]?.map((msg,key) =>{ */}
                                {this.state.username?.length > 0 && this.state[`${this.state.username}`]?.map((msg,key) =>{
                                    return(<li key={key}>{msg.senderusername}<span>{' '}{msg.message}</span></li>);
                                })
                                }
                                </ul>
                            </div>
                        </div>
                        {' '}
                        <div>
                            {' '}
                            <input 
                            type="text"
                            name="message"
                            value={message}
                            onChange={this.onTextboxChangeMessage}
                            ></input>
                            <button className='btn btn-info' onClick={(e)=> {this.SendMessage(e,currentUser.user._id,this.state.username,this.state.message,currentUser.user.username)}}>Send</button>
                        </div>
                        {' '}
                    </div>)
                    }
                </div>
            </div>
        )
        }
    }
}

服务器代码:

io.on('connection', (socket) => { /* socket object may be used to send specific messages to the new connected client */
  console.log('connection established',socket.id);
  socket.on('send', (data)=>{
    console.log("Receive data from single username",data)
     io.emit('message',data)
     socket.on('message',data => {
        console.log("private")
        io.to(data.receiverid).emit('message',data)
     })
  });
  
  socket.on('disconnected',()=>{
    console.log("disconnect")
  })
});
安泰克

这是因为您每次发送消息时都会向套接字分配另一个新的回调。

移动此部分:

this.socket.on(`${receiverusername}`, (d)=>{
  if(this.state[`${receiverusername}`]?.length >= 1 ){
    let messageList = this.state[`${receiverusername}`]
    this.setState({[`${receiverusername}`]:[...messageList,d]})
} else {
    this.setState({[`${receiverusername}`]:[d]})
    console.log('else Condition store individual messages', 
    this.state[`${receiverusername}`])
}

进入onconnect回调:

this.socket.on('connect',()=> {
  this.setState({ socketConnected : true})

  this.socket.on("message", (d)=>{
    if(this.state[`${d.receiverusername}`]?.length >= 1 ){
      let messageList = this.state[`${d.receiverusername}`]
      this.setState({[`${receiverusername}`]:[...messageList,d.content]})
  } else {
      this.setState({[`${d.receiverusername}`]:[d.content]})
      console.log('else Condition store individual messages', 
      this.state[`${receiverusername}`])
  }
})

但是在此变体中,您没有Receiverusername。因此,您应该从服务器发送常规的“消息”事件作为包含接收器用户名的对象。

有关on方法的详细说明,请参见socket.io文档:https ://socket.io/docs/v3/listening-to-events/

这里记录了在onconnect处理程序中分配onmessage回调的模式:

https://socket.io/get-started/chat/#Broadcasting

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

每当我输入正确的密码时,都会显示一条错误消息

来自分类Dev

每当我尝试从 Firebase 获取用户名时,它都会返回值但不会在 String 中更新

来自分类Dev

每当我在emacs中输入评论时,流浪汉都会冻结它

来自分类Dev

每当我尝试使用网站进行测试时,都会在“电子邮件”文本框中收到错误消息

来自分类Dev

每当我在react native中编辑文本输入字段时,都会显示警报提示

来自分类Dev

每当我启动vim时,它都会以为我按了'd'。如何停止这种行为?

来自分类Dev

Pygame:每当我尝试捡起已经扔出的瓷砖时,都会收到错误消息

来自分类Dev

每当我尝试将自己添加到sudoers时都会收到错误消息

来自分类Dev

每当我尝试连接数据库时都会收到错误消息

来自分类Dev

为什么每当我输入废话命令时都会生成此python错误消息?

来自分类Dev

为什么每当我使用“-=”代替“+=”时python都会给出错误消息?

来自分类Dev

每当我回到相同的片段时,Android Fragment都会创建重复的标签

来自分类Dev

每当我使用sudo命令时,它都会显示“ >>> /etc/sudoers.d/90-cloudimg-ubuntu:第1行附近的语法错误<<<”

来自分类Dev

当我多次运行程序(在C中)时,它总是选择相同的随机数

来自分类Dev

如何在 python 3.0 中修复这种类型的错误?每当我使用传递参数(dict{})时,它都会显示这种类型的错误“NameError: name 'P' is not defined”

来自分类Dev

在我的Google Search API调用中,它返回有效的JSON,但是每当我解析它以获取特定值时,都会得到Undefined

来自分类Dev

每当我尝试移动按钮时,都会在运行时给我XML错误

来自分类Dev

每当我尝试提交表单时都会显示sqlalchemy.exc.InterfaceError

来自分类Dev

每当我启动Word时,都会显示一个配置窗口。

来自分类Dev

每当我每次运行时尝试在应用程序中进行gmail登录集成时,都会显示相同的错误

来自分类Dev

每当我每次运行时尝试在应用程序中进行gmail登录集成时,都会显示相同的错误

来自分类Dev

在Ubuntu中没有视频文件的缩略图,每当我导航到其中包含视频文件的文件夹时,都会显示一个Apport消息框

来自分类Dev

表单验证错误:每当我单击“提交”按钮时,都会在errorDiv上附加错误结果

来自分类Dev

每当我尝试退出Eclipse时,它都会要求我“确认选择不正确”

来自分类Dev

每当我在JTextField中编写时,Swing Java JComboBox都会消失

来自分类Dev

每当我在类中的某个位置设置状态时,都会触发componentDidMount吗?

来自分类Dev

每当我更新记录时,PHP都会添加空格

来自分类Dev

每当我启动时,Eclipse都会自动关闭

来自分类Dev

每当我修改位置时,ip地址都会更改

Related 相关文章

  1. 1

    每当我输入正确的密码时,都会显示一条错误消息

  2. 2

    每当我尝试从 Firebase 获取用户名时,它都会返回值但不会在 String 中更新

  3. 3

    每当我在emacs中输入评论时,流浪汉都会冻结它

  4. 4

    每当我尝试使用网站进行测试时,都会在“电子邮件”文本框中收到错误消息

  5. 5

    每当我在react native中编辑文本输入字段时,都会显示警报提示

  6. 6

    每当我启动vim时,它都会以为我按了'd'。如何停止这种行为?

  7. 7

    Pygame:每当我尝试捡起已经扔出的瓷砖时,都会收到错误消息

  8. 8

    每当我尝试将自己添加到sudoers时都会收到错误消息

  9. 9

    每当我尝试连接数据库时都会收到错误消息

  10. 10

    为什么每当我输入废话命令时都会生成此python错误消息?

  11. 11

    为什么每当我使用“-=”代替“+=”时python都会给出错误消息?

  12. 12

    每当我回到相同的片段时,Android Fragment都会创建重复的标签

  13. 13

    每当我使用sudo命令时,它都会显示“ >>> /etc/sudoers.d/90-cloudimg-ubuntu:第1行附近的语法错误<<<”

  14. 14

    当我多次运行程序(在C中)时,它总是选择相同的随机数

  15. 15

    如何在 python 3.0 中修复这种类型的错误?每当我使用传递参数(dict{})时,它都会显示这种类型的错误“NameError: name 'P' is not defined”

  16. 16

    在我的Google Search API调用中,它返回有效的JSON,但是每当我解析它以获取特定值时,都会得到Undefined

  17. 17

    每当我尝试移动按钮时,都会在运行时给我XML错误

  18. 18

    每当我尝试提交表单时都会显示sqlalchemy.exc.InterfaceError

  19. 19

    每当我启动Word时,都会显示一个配置窗口。

  20. 20

    每当我每次运行时尝试在应用程序中进行gmail登录集成时,都会显示相同的错误

  21. 21

    每当我每次运行时尝试在应用程序中进行gmail登录集成时,都会显示相同的错误

  22. 22

    在Ubuntu中没有视频文件的缩略图,每当我导航到其中包含视频文件的文件夹时,都会显示一个Apport消息框

  23. 23

    表单验证错误:每当我单击“提交”按钮时,都会在errorDiv上附加错误结果

  24. 24

    每当我尝试退出Eclipse时,它都会要求我“确认选择不正确”

  25. 25

    每当我在JTextField中编写时,Swing Java JComboBox都会消失

  26. 26

    每当我在类中的某个位置设置状态时,都会触发componentDidMount吗?

  27. 27

    每当我更新记录时,PHP都会添加空格

  28. 28

    每当我启动时,Eclipse都会自动关闭

  29. 29

    每当我修改位置时,ip地址都会更改

热门标签

归档