Node.js React Native、NodeJS、Socket.io

Node.js React Native、NodeJS、Socket.io,node.js,react-native,socket.io,Node.js,React Native,Socket.io,我正在尝试在我的应用程序中实现1-1私人消息功能,如果两个用户同时出现在聊天屏幕上,则可以实时交换消息,如果没有,则消息将存储在我的postgres数据库中,当用户再次打开聊天时,消息将被加载 当前使用我的代码,当两个用户的聊天室都打开时,当我尝试发送消息时,消息不会被实时发送。我需要刷新应用程序,以便更新聊天室。我认为我的套接字正在工作,因为我的控制台日志在前端和后端控制台中都被返回 我的问题是如何使这些消息生效并正确更新我的平面列表(即,新消息出现在我的倒排列表的底部) 这是我的密码: 客户

我正在尝试在我的应用程序中实现1-1私人消息功能,如果两个用户同时出现在聊天屏幕上,则可以实时交换消息,如果没有,则消息将存储在我的postgres数据库中,当用户再次打开聊天时,消息将被加载

当前使用我的代码,当两个用户的聊天室都打开时,当我尝试发送消息时,消息不会被实时发送。我需要刷新应用程序,以便更新聊天室。我认为我的套接字正在工作,因为我的控制台日志在前端和后端控制台中都被返回

我的问题是如何使这些消息生效并正确更新我的平面列表(即,新消息出现在我的倒排列表的底部)

这是我的密码:

客户端

  const message = route.params.message;
  const [messages, setMessages] = useState([]);
  const [text, setText] = useState('');
  const [socket, setSocket] = useState(null);
  const { user } = useAuth();

  useEffect(() => {
  const newsocket =io.connect(socketURL)
  setMessages(message.Messages)
  newsocket.on('connect', msg => {
  console.log(`user: ${user.id} has joined conversation ${message.id}`)
  setSocket(newsocket)
  });

  newsocket.on("send_message", (msg) => {
  console.log("this is the chat message:", msg);
  const data = [...messages]; 
  data.push(msg);
  setMessages(data); 
  });

  return(()=>newsocket.close());
  }, []);

  const onSend = (ConversationId,senderId,receiverId,message) => {
messagesApi.sendMessage({ConversationId,senderId,receiverId,message});
setText("")
const to = (user.id===route.params.message.user1? 
route.params.message.user2:route.params.message.user1)
    socket.emit(
    'message', { to: to, from: user.id, message,ConversationId });
  };

 const updateText=(text)=>{
 setText(text);
 }

<FlatList
    inverted
    data={messages}
    keyExtractor={(item,index)=>index.toString()}
    extraData={messages}
    renderItem={({item,index})=>(
        <>
        <Text>
         {moment(item.createdAt).fromNow()}
         </Text>
        <MessageBubble
        text={item.message}
        mine={item.senderId !== user.id}
        />
         </>
    )}   
    bounces={false}  
    />
    <View style={styles.messageBoxContainer}>
        <TextInput 
        onChangeText={updateText} 
        value={text} 
        />
        <TouchableOpacity 
         onPress={()=>{
         onSend(
         message.id,
         user.id, 
         (user.id===message.user1?message.user2:message.user1),
         text
         )}}
         >
         <Text>Send</Text>
        </TouchableOpacity>
     </View>

提前谢谢你,我已经试着解决这个问题好几个星期了,但还是不能解决。非常感谢您的帮助。

经过多次尝试,多亏Srikanth对这一问题的回答,我成功地让它工作了

客户

useEffect(() => {
const newsocket =io.connect("http://192.168.1.103:9000")
setMessages(message.Messages)

newsocket.on('connect', msg => {
    console.log(`user: ${user.id} has joined conversation ${message.id}`)
    setSocket(newsocket)
    newsocket.emit('subscribe', message.id);
 });

newsocket.on("send_message", (msg) => {
    console.log("this is the chat messages:", msg);
    setMessages(messages => messages.concat(msg))
  });
 
 return(()=>newsocket.close());

 }, []);

const onSend = (ConversationId,senderId,receiverId,message) => {
console.log("sent")
const to = (user.id===route.params.message.user1? 
route.params.message.user2:route.params.message.user1)
socket.emit('message', { to: to, from: user.id, message,ConversationId });
setText("")
messagesApi.sendMessage({ConversationId,senderId,receiverId,message});
};
服务器

io.on('connection',(socket)=>{
console.log('User '+socket.id+' connected')

socket.on('subscribe', (room)=> {
console.log('joining room', room);
socket.join(room);
});

socket.on('message', (data) => {
console.log(data)
console.log('sending room post',data.ConversationId)
io.sockets.in(data.ConversationId).emit('send_message', { message: 
data.message, receiverId: 
data.to,senderId:data.from,conversationId:data.ConversationId });
})
})

我读过很多评论,建议不要在1-1私人信息中使用聊天室,但这是唯一可行的方法。

经过多次尝试后,由于Srikanth对此的回答,我成功地让它工作起来

客户

useEffect(() => {
const newsocket =io.connect("http://192.168.1.103:9000")
setMessages(message.Messages)

newsocket.on('connect', msg => {
    console.log(`user: ${user.id} has joined conversation ${message.id}`)
    setSocket(newsocket)
    newsocket.emit('subscribe', message.id);
 });

newsocket.on("send_message", (msg) => {
    console.log("this is the chat messages:", msg);
    setMessages(messages => messages.concat(msg))
  });
 
 return(()=>newsocket.close());

 }, []);

const onSend = (ConversationId,senderId,receiverId,message) => {
console.log("sent")
const to = (user.id===route.params.message.user1? 
route.params.message.user2:route.params.message.user1)
socket.emit('message', { to: to, from: user.id, message,ConversationId });
setText("")
messagesApi.sendMessage({ConversationId,senderId,receiverId,message});
};
服务器

io.on('connection',(socket)=>{
console.log('User '+socket.id+' connected')

socket.on('subscribe', (room)=> {
console.log('joining room', room);
socket.join(room);
});

socket.on('message', (data) => {
console.log(data)
console.log('sending room post',data.ConversationId)
io.sockets.in(data.ConversationId).emit('send_message', { message: 
data.message, receiverId: 
data.to,senderId:data.from,conversationId:data.ConversationId });
})
})
我读过很多评论,建议不要在1-1私人信息中使用房间,但这是唯一可行的方法