Я создал базу данных mongochat
, в которой есть коллекция chat
. Как я могу вставить документ в коллекцию чата? Каждый документ имеет сообщение и дату как пары ключ-значение. Схема документа, т.е. схема сообщения:
message.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// Create Schema
const MessageSchema = new Schema({
message: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
}
});
module.exports = Message = mongoose.model('Message', MessageSchema);
server.js:
const express = require('express');
const mongoose = require('mongoose');
const socket = require('socket.io');
const message = require('./model/message')
const app = express();
const db = require('./config/keys').mongoURI;
mongoose.connect(db, {useNewUrlParser: true})
.then(() => console.info('Mongodb connected...'))
.catch( err => console.info(err));
const port = 5000;
let server = app.listen(5000, function(){
console.info('server is running on port 5000')
});
let io = socket(server);
io.on("connection", function(socket){
console.info("Socket Connection Established with ID :"+ socket.id)
socket.on('disconnect', function(){
console.info('User Disconnected');
});
let chat = db.collection('chats'); <-- this is collection
socket.on('SEND_MESSAGE', data => {
io.emit('RECEIVE_MESSAGE', data);
});
})
client.js:
import React, { Component } from 'react'
import './chat.css'
import io from "socket.io-client";
export default class Chat extends Component {
constructor(props){
super(props);
this.state = {
message: '',
date: '',
messages: []
};
const socket = io('localhost:5000');
this.sendMessage = event => {
event.preventDefault();
if (this.state.message !== ''){
socket.emit('SEND_MESSAGE', {
message: this.state.message,
date: Date.now()
});
this.setState({ message: '', date: '' });
}
};
socket.on('RECEIVE_MESSAGE', data => {
addMessage(data);
});
const addMessage = data => {
console.info(data);
this.setState({
messages: [...this.state.messages, data],
});
console.info(this.state.message);
console.info(this.state.messages);
};
}
render() {
return (
<div>
<div id = "messages" className = "card-block">
{this.state.messages.map((message, index) => {
return (
<div key = {index} className = "msgBox"><p className = "msgText">{message.message}</p></div>
)
})}
</div>
<input id = "inputmsg" type = "text" placeholder = "Enter Message...."
value = {this.state.message} onChange = {ev => this.setState({message: ev.target.value})}/>
<button id = "send" className = "button" onClick = {this.sendMessage}>Send</button>
</div>
)
}
}
Когда вы получите сообщение, сохраните его тело в своей коллекции следующим образом:
let chat = db.collection('chats'); <-- this is collection
socket.on('SEND_MESSAGE', data => {
const instance = new chat(data); <-- data as { message: '', date: '' }
try {
const result = await instance.save();
} catch(...)
});
})
@funjoker, если попытка блока прошла успешно, вы можете испустить событие данных в этом блоке
В моем случае я не могу понять, как будут работать SEND_MESSAGE
и RECEIVE_MESSAGE
? После создания нового экземпляра, как я могу отправить обновленные данные обратно для отображения?
Итак, код, который вы написали, сохранит данные в mongodb, но как я могу передать эти данные для события ->
RECEIVE_MESSAGE