类型错误:msg.map 不是函数

Posted

技术标签:

【中文标题】类型错误:msg.map 不是函数【英文标题】:TypeError: msg.map is not a function 【发布时间】:2022-01-12 16:27:36 【问题描述】:

我正在尝试使用 React、node 和 mongodb 创建实时在线聊天。在我看来,聊天应该以这种方式工作:客户端将他创建的消息对象发送到服务器以通过休息(正常工作)和套接字保存它,因此套接字服务器将消息“广播”到每个套接字同一个房间(连接上的插座根据本地存储中存储的东西放在一个房间里)。因此,同一个房间中的其他客户端应该收到消息,并将其发生在聊天中。但它不是workink。实际上,出现以下错误:Uncaught TypeError: msg.map is not a function

这是我的反应代码:

import useState, useEffect from 'react';
import axios from 'axios';
import  io  from "socket.io-client";

const Chat = () => 
    const [msg, setMsg] = useState([]);
    const [message, setMessage] = useState('');
    const socket = io("http://localhost:5050");

    useEffect(() => 
        if(v.group.name)
            axios.get(`http://localhost:5050/chat/getmsg/$v.group.name`)
                .then(group =>     
                    setMsg(group.data)
                )
        
    , [v.group.name])
    
    useEffect(() => 
        if(localStorage.getItem('isG') === '1')       

            socket.on("connect", () => 
                socket.emit("groupName", id:localStorage.getItem('gruop'))
            )

            socket.on("message", messageS => 
                if(messageS.sender !== localStorage.getItem('user'))
                setMsg(...msg, messageS)
            )

        
    // eslint-disable-next-line
    , [socket])

    const sendMSG = (e) => 
        e.preventDefault();
        if(message !== "")
            axios.post("http://localhost:5050/chat/sendmsg", name:v.group.name, sender:localStorage.getItem('user'), text:message)
                .then(() => 
                    setMessage('');
                    socket.emit("message", name:v.group.name, sender:localStorage.getItem('user'), text:message)
                    setMsg(...msg, name:v.group.name, sender:localStorage.getItem('user'), text:message)
                );
        
    

    return <div className="containerLogin1">
        <div>
            <h3>Chat Name</h3>
        </div>
        <div className="chatSpace">
            
                msg.map((m) => 
                    return <p key=m._id>m.text</p>
                )
            
        </div>
        <form className="sMSG"> 
            <input type="input" style='border':'2px solid black' value=message onChange=(e) => setMessage(e.target.value)/>
            <button className="buttSend" onClick=sendMSG spellCheck="false">Send</button>
        </form>
    </div>

这是服务器代码,但我认为他工作正常:

....
const httpServer = app.listen(port, () => console.log(`Server listening on port $port`));

const  Server  = require("socket.io");
const io = new Server(httpServer, 
    cors : 
        origin: "*",
        methods:["GET", "POST"]
    
 );

io.on("connection", (socket) => 
    let currentRoom = "";

    socket.on("groupName", msg => 
        socket.join(msg.id + "")
        currentRoom = msg.id
    )

    socket.on("text-change", newText => 
        io.to(currentRoom).emit( "text-change", text:newText, emitter:socket.id)
    )

    socket.on("message", message => 
        io.to(currentRoom).emit("message", message);
    )

)

我尝试使用大量的 console.log 来查看错误可能出在哪里,但我找不到。似乎在代码中的某个地方,msg 从一个数组变成了一个对象,因此 map 函数崩溃了。有人可以帮帮我吗?谢谢

【问题讨论】:

试试这个方法 --> (msg || []).map( 它返回:(msg || []).map 不是函数 如果.map 不是一个函数,那么msg 不是一个数组。检查您的setMsg 并确保您没有将对象设置为状态而不是数组。 【参考方案1】:

您的代码中有这两行试图复制最后一个数组并向其中添加新对象:

setMsg(...msg, messageS);

还有:

setMsg(...msg, name:v.group.name, sender:localStorage.getItem('user'), text:message);

这些部分是问题,你应该在它们周围加上[]。所以:

setMsg([...msg, messageS]);
setMsg([...msg, name:v.group.name, sender:localStorage.getItem('user'), text:message]);

【讨论】:

非常感谢

以上是关于类型错误:msg.map 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:todo 不是函数

类型错误:opendirSync 不是函数

错误类型错误:array.map 不是角度管道中的函数

错误类型错误:this.route.params.flatMap 不是函数

类型错误:hbs 不是函数

类型错误:require.requireActual 不是函数