问题描述
我目前正在关注webDevSimplified的教程
youtube:https://www.youtube.com/watch?v=tBr-PybP_9c
github存储库:https://github.com/WebDevSimplified/Whatsapp-Clone
我已经无数次地将代码与存储库进行了比较,并且阅读了socket.io的文档,但无济于事。
已经有一些线程存在类似的问题,但是许多线程没有得到答案,或者只是设置完全不同。
我已经为项目使用了纱线包管理器,而不是教程中所示的npm,但是我怀疑这是罪魁祸首。我已经安装了所有必需的依赖项。
让我们从 server.js
开始const io = require('socket.io')(5000) // I changed it to 3000 but just got a different Error(see title)
io.on('connection',socket => {
const id = socket.handshake.query.id
socket.join(id)
socket.on('send-message',({ recipients,text }) => {
recipients.forEach(recipient => {
const newRecipients = recipients.filter(r => r !== recipient)
newRecipients.push(id)
socket.broadcast.to(recipient).emit('receive-message',{
recipients: newRecipients,sender: id,text
})
})
})
})
在此应用中,我们使用useContext
为我们的组件提供了插座。
这是 socketProvider.js
import React,{ useContext,useEffect,useState } from "react";
import io from "socket.io-client";
const SocketContext = React.createContext();
export function useSocket() {
return useContext(SocketContext);
}
export function SocketProvider({ id,children }) {
const [socket,setSocket] = useState();
//console.log(socket)
useEffect(() => {
const newSocket = io("http://localhost:5000",{ query: { id } });// I changed the host here as well to 3000 but I either get a POST or a GET error respectively
setSocket(newSocket);
return () => newSocket.close();
},[id]);
return (
<SocketContext.Provider value={socket}>{children}</SocketContext.Provider>
);
}
然后将其嵌套在另一个contextProvider中,又称为 Conversationsprovider.js
import React,useState,useCallback } from "react";
import useLocalStorage from "../hooks/useLocalStorage";
import { useContacts } from "./ContactsProvider";
import { useSocket } from "./SocketProvider";
const ConversationsContext = React.createContext();
export function useConversations() {
return useContext(ConversationsContext);
}
export function Conversationsprovider({ id,children }) {
const [conversations,setConversations] = useLocalStorage("conversations",[]);
const [selectedConversationIndex,setSelectedConversationIndex] = useState(0);
const { contacts } = useContacts();
const socket = useSocket();
function createConversation(recipients) {
setConversations((prevConversations) => {
return [...prevConversations,{ recipients,messages: [] }];
});
}
const addMessagetoConversation = useCallback(({ recipients,text,sender }) => {
setConversations((prevConversations) => {
let madeChange = false;
const newMessage = { sender,text };
const newConversations = prevConversations.map((conversation) => {
if (arrayEquality(conversation.recipients,recipients)) {
madeChange = true;
return {
...conversation,messages: [...conversation.messages,newMessage],};
}
return conversation;
});
if (madeChange) {
return newConversations;
} else {
return [...prevConversations,messages: [newMessage] }];
}
});
},[setConversations])
useEffect(() => {
if(socket == null) return
socket.on('receive-message',addMessagetoConversation)
return () => socket.off('receive-message')
},[socket,addMessagetoConversation])
function sendMessage(recipients,text) {
socket.emit('send-message',text })
addMessagetoConversation({ recipients,sender: id });
}
const formattedConversations = conversations.map((conversation,index) => {
const recipients = conversation.recipients.map((recipient) => {
const contact = contacts.find((contact) => {
return contact.id === recipient;
});
const name = (contact && contact.name) || recipient;
return { id: recipient,name };
});
const messages = conversation.messages.map(message => {
const contact = contacts.find((contact) => {
return contact.id === message.sender;
})
const name = (contact && contact.name) || message.sender;
const fromMe = id === message.sender
return { ...message,senderName: name,fromMe }
})
const selected = index === selectedConversationIndex;
return { ...conversation,messages,recipients,selected };
});
const value = {
conversations: formattedConversations,selectedConversation: formattedConversations[selectedConversationIndex],sendMessage,selectConversationIndex: setSelectedConversationIndex,createConversation,};
return (
<ConversationsContext.Provider value={value}>
{children}
</ConversationsContext.Provider>
);
}
function arrayEquality(a,b) {
if (a.length !== b.length) return false;
a.sort();
b.sort();
return a.every((element,index) => {
return element === b[index];
});
}
我以前没有使用过websocket.API / socket.io的经验,并且还没有完全了解工作流程。我希望有人可能会看到我到目前为止没有发现/发现的错误。
我认为此反应设置与常规设置略有不同,因为我无法在线找到任何类似的设置,这可能有助于解决我的问题。
如果您认为这很重要,请检查上面的主存储库。我的本地文件夹结构和代码相同。
我将尝试另一个堆栈,看看是否可以使其与node.js一起运行,或者同时从文档中尝试示例。
解决方法
我找到了错误的原因。我只是错过了在服务器目录中运行nodemon脚本。