【发布时间】:2019-07-20 16:14:06
【问题描述】:
在加入之前,我遵循了一些关于如何显示在聊天室中发送的消息的教程,但我不知道如何在 React 中显示它们,并且我在服务器端有几个问题。
客户端,在构造函数中:
this.state = {
msg: "",
messages: []
};
客户端,我有一个表单,点击按钮将通过此功能将消息发送到服务器:
sendMessage(e) {
e.preventDefault();
let msg = this.state.msg;
this.socket.emit("sendMessage", msg);
this.setState({ msg: "" });
}
服务器端,我有一个用于消息的猫鼬模式,名为 Message,数据库中的集合是消息。
const Message = new mongoose.Schema({
sender: {
type: "string"
},
message: {
type: "string"
}
});
var messages = [];
io.on("connection", (socket, user) => {
var user = socket.request.session.user;
Message.find({}).exec((err, messages) => {
if (err) throw err;
console.log(messages);
io.emit("showingPastMessages", messages);
});
console.log(messages) 在 PowerShell 中显示保存在 Mongo 中的 JavaScript 对象数组中的所有消息(条目)? [{id_:4qxxx,发件人:'user123',消息:'hello!'},{id_:5exxx,发件人:'user456',消息:'hi!'}] 我想知道是否可以仅访问 sender 和 message 属性以将其发送给客户端?像 messages.sender + messages.message 这样的东西,因为当我 console.log(messages.message) 它显示未定义
这里是服务器接收发送的消息然后将其保存在 Mongo 中的地方。
socket.on("sendMessage", function(msg) {
var newMsg = new Message({ message: msg, sender: user });
newMsg.save(function(err) {
if (err) {
console.log(err);
} else {
messages.push(newMsg);
console.log(newMsg);
console.log(messages);
}
});
});
console.log(newMsg) 显示最新发送的消息,但是console.log(messages) 不显示以前的消息,而只显示最新的消息,为什么?
那么在 React 中,我应该在构造函数中,在 ComponentDidMount() 中有类似的东西吗?如果应该是prevState
this.socket.on("showingPastMessages", function(messages){
this.setState({ ...this.state.messages, messages})
});
你能给我一些建议吗?
这是我检索数据的客户端代码:
class Chat extends Component {
constructor(props) {
super(props);
this.state = {
msg: "",
messages: []
};
var socket = io('http://localhost:3000');
this.socket.on("history", function(messages) {
console.log(messages);
});
}
【问题讨论】:
-
您可以将套接字添加到连接
socket.join('room');的房间,然后发送到您保存消息io.to('room').emit('message', msg);的房间。如果这有帮助,我会输入更详尽的答案。 -
是的,但新加入的用户看不到聊天室中发送的先前消息?我在stackoverflow上搜索了将消息存储在数据库中的信息,即使您不在房间里也可以显示以前的消息。不知道我解释的好不好
-
我发布了一个更彻底的答案。让我知道你的想法。
标签: node.js reactjs express mongoose socket.io