这是我的代码。
const Chatroom = ({ user, getAllMessages, setGetAllMessages }) => {
const [getMessages, setGetMessages] = useState();
const [userMessage, setUserMessage] = useState('');
const [getAllUsers, setGetAllUsers] = useState();
const [flag, setFlag] = useState(false);
const [randomColor, setRandomColor] = useState(
Math.floor(Math.random() * 16777215).toString(16)
);
const messagesEndRef = useRef(null);
const scrollToBottom = () => {
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
};
useEffect(() => {
fetch(`http://localhost:4000/getallusers`)
.then((data) => data.json())
.then((users) => {
console.log('-----ALL USERS------', users);
setGetAllUsers(users);
})
.catch((err) => console.log(err));
}, []);
useEffect(() => {
fetch(`http://localhost:4000/getuser/${user.username}/${user.id}`)
.then((response) => response.json())
.then((data) => {
setGetMessages(data.message);
})
.catch((err) => {
console.log(err);
});
}, []);
const sendMessage = (e) => {
setUserMessage('');
e.preventDefault();
const body = {
userMessage: userMessage,
user: user.username,
userId: user.id,
};
fetch(`http://localhost:4000/sendmessage/${user.id}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(body),
})
.then((data) => {
return data.json();
})
.then((message) => {
console.log('success', message);
setFlag(true);
})
.catch((err) => {
console.log(err);
});
};
const getUserInput = (e) => {
setUserMessage(e.target.value);
};
useEffect(() => {
if (flag === true);
fetch(`http://localhost:4000/getallmessages`)
.then((data) => data.json())
.then((messages) => {
setGetAllMessages(messages);
setFlag(false);
})
.catch((err) => {
console.log(err);
});
}, [flag]);
useEffect(() => {
scrollToBottom();
}, [getAllMessages, flag]);
if (
user === undefined ||
getMessages === undefined ||
getAllMessages === undefined ||
getAllUsers === undefined
)
return <p>loading..</p>;
return (
<div className={classes.ChatroomContainer}>
<h1>Welcome {user ? user.username : 'Elita'}</h1>
<div className={classes.ChatroomBox}>
{getAllMessages.message.map((allMessages) => (
<div key={allMessages.id}>
<p>
{getAllUsers.messages.map((user) =>
user.id === allMessages.userId ? (
<span
key={user.id}
className={classes.UsernameColor}
//create a random color to differenciate users.
style={{
color: '#' + randomColor,
}}
>
{user.username} :
</span>
) : (
''
)
)}
{allMessages.message}
</p>
<div ref={messagesEndRef} />
</div>
))}
<input type='hidden' name={user ? user.username : ''} />
<input type='hidden' name={user ? user.id : ''} />
</div>
<div className={classes.SendMessageUI}>
<input
type='text'
name='userMessage'
placeholder='hi eli ;)'
onChange={(e) => getUserInput(e)}
onKeyDownCapture={(e) => (e.keyCode === 13 ? sendMessage(e) : null)}
value={userMessage}
></input>
<button onClick={sendMessage}>Send</button>
</div>
</div>
);
};
这是数据库。我正在使用带有 sequelize 的 MYSQL
exports.getAllMesssages = (req, res, next) => {
Message.findAll()
.then((messages) => {
if (!messages) {
console.log('oops no messages');
res.json({ message: 'oops no messages' });
return next();
}
console.log(messages);
res.json({ message: messages });
})
.catch((err) => {
console.log(err);
});
};
exports.postSendMessage = (req, res, next) => {
const message = req.body.userMessage;
const userId = req.params.userid;
console.log(req.params);
Message.create({
message: message,
userId: userId,
})
.then((message) => {
console.log(message);
res.json({ message: 'success!', message: message });
})
.catch((err) => {
console.log(err);
res.json({ message: 'something went wrong.' });
});
};
如果我只在一个选项卡上打开,它会重新呈现。但是,如果我打开另一个选项卡并键入消息,则另一个选项卡不会呈现,甚至不知道已发送消息。有什么办法可以获得这些数据吗?谢谢你。我是一名自学成才的开发人员,我正在努力学习足够的知识,以便找到自己的第一份工作。