javascript - 如何在socket.io中发出数据?

标签 javascript node.js reactjs mongodb socket.io

我创建了名为chat的集合。现在我可以通过单击发送按钮将聊天存储在 mongodb 中,但如何在前端显示数据?

服务器.js:

    const express = require('express');
const mongoose = require('mongoose');
const socket = require('socket.io');
const message = require('./model/message')

const app = express();

const mongoURI = require('./config/keys').mongoURI;

mongoose.connect(mongoURI, {useNewUrlParser: true})
  .then()
  .catch( err => console.log(err));

let db = mongoose.connection;

const port = 5000;

let server = app.listen(5000, function(){
  console.log('server is running on port 5000')
});

let io =  socket(server);

io.on("connection", function(socket){
  console.log("Socket Connection Established with ID :"+ socket.id)

  socket.on('disconnect', function(){
    console.log('User Disconnected');
  });

  let chat = db.collection('chat');

      socket.on('SEND_MESSAGE', function(data){
        let message = data.message;
        let date = data.date;

        // Check for name and message
        if(message !== '' || date !== ''){
            // Insert message
            chat.insert({message: message, date:date}, function(){
                socket.emit('RECEIVE_MESSAGE', [data]);
            });
        }
    });

    chat.find({}).limit(100).sort({_id:1}).toArray(function(err, res){
      if(err){
          throw err;
      }
      // Emit the messages
      socket.emit('RECEIVE_MESSAGE', res);
    });

}) 

聊天.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.log(data);
            this.setState({
              messages: [...this.state.messages, data],
            });
            console.log(this.state.message);
            console.log(this.state.messages);
        };

    }

    render() {
        return (
        <div>
                <div id="status"></div>
                <div id="chat">
                    <div className="card">
                        <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>
                    </div>
                    <div className="row">
                        <div className="column">
                            <input id="inputmsg" type="text" placeholder="Enter Message...."
                            value={this.state.message} onChange={ev => this.setState({message: ev.target.value})}/>
                        </div>
                        <div className="column2">
                            <button id="send" className="button" onClick={this.sendMessage}>Send</button>
                        </div>
                    </div>
                </div>
        </div>
        )
    }
}

在 chat.js 中,我正在映射消息数组。在 chat.js 中,SEND_MESSAGE 事件正在工作,即我可以在 mongodb 中插入文档,但如何取回数据并使用 socket.io 显示它?

整个代码:https://gist.github.com/aditodkar/0328809b636aca142ffb8cffdc320b3b

截图:

enter image description here

最佳答案

也许您需要在客户端的第 30 行使用:

socket.on('RECEIVE_MESSAGE', data => {
            addMessage(data);
        });

但你使用:

socket.emit('RECEIVE_MESSAGE', data => {
            addMessage(data);
        });

更新:

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: []
        };
        this.sendMessage = this.sendMessage.bind(this);
        this.addMessage = this.addMessage.bind(this);

        this.socket = io('localhost:5000');
    }

    componentDidMount() {
      this.socket.on('RECEIVE_MESSAGE', data => {
          this.addMessage(data);
      });
    }

    sendMessage(event) {
      event.preventDefault();

      if(this.state.message !== ''){
        this.socket.emit('SEND_MESSAGE', {
            message: this.state.message,
            date: Date.now()
        });
        this.setState({ message: '', date: '' });
      }
    };

    addMessage(data) {
      console.log(data);
      this.setState({
        messages: [...this.state.messages, data],
      });
      console.log(this.state.message);
      console.log(this.state.messages);
    };

    render() {
        return (
        <div>
                <div id="status"></div>
                <div id="chat">
                    <div className="card">
                        <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>
                    </div>
                    <div className="row">
                        <div className="column">
                            <input id="inputmsg" type="text" placeholder="Enter Message...."
                            value={this.state.message} onChange={ev => this.setState({message: ev.target.value})}/>
                        </div>
                        <div className="column2">
                            <button id="send" className="button" onClick={this.sendMessage}>Send</button>
                        </div>
                    </div>
                </div>
        </div>
        )
    }
}

关于javascript - 如何在socket.io中发出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53023207/

相关文章:

node.js - 在文件更改时重新启动 Heroku 本地?

javascript - 我怎样才能从我的api调用我的id到reactjs

javascript - 如何将 Material ui 添加到 gatsby 站点生成器

javascript - 在javascript中检查数组中的所有值是否相同

javascript - Angular 2 @HostListener 未捕获 keyup 事件

javascript - 动态定位 Bootstrap 工具提示(用于动态生成的元素)

node.js - 在其他JS文件中使用socket.io模块

javascript - 验证上传文件大小

javascript - 使用 Mongoose 更新信息,对象内部的数组动态地更新

javascript - 在 Redux-saga 中,如何从 Promise 的 Yield 调用中获取结果?