【问题标题】:How to display data from mongodb on client side?如何在客户端显示来自 mongodb 的数据?
【发布时间】:2019-03-31 23:09:37
【问题描述】:

我使用 nodejs/express、mongodb、reactjs 创建了一个聊天应用程序。当我在聊天框中键入并单击发送按钮时,数据存储在 mongodb 中,但我如何在客户端显示它。在下面的代码中,我无法在客户端显示它。在 server.js 中,我无法发出消息。我在 server.js 做错了什么?数据未从后端/数据库到达前端。

代码:

server.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('output', [data]);
            });
        }
    });

    //Code below this is not working:
    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.emit('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>
        )
    }
}

mongo shell 截图:

【问题讨论】:

    标签: node.js reactjs mongodb


    【解决方案1】:

    Mongoose 文档指定了 .find() 方法的正确用法。你可以找到它here

    为了避免追逐,您需要为方法提供您正在寻找的对象模型。因此,例如,如果您正在寻找具有特定日期字段的对象,您可以使用:

    chat.find({ "date": <some-date> }, function(err, objects) { ... });
    

    如果你想从集合中获取所有对象,你可以使用:

    chat.find({}, function(err, objects) { ... });
    

    【讨论】:

    • 但这有什么问题-> chat.find().limit(100).sort({_id:1}).toArray(function(err, res){
    • 您将 null 传递给 find 方法,这会产生未定义的后果。你需要给它一个对象,它可以分析并给你想要的结果。
    • 这解决了您的问题吗?如果是这样,则将答案标记为正确,将问题标记为已关闭。
    • 你的回答没有解决问题你可以在这里看到类似的代码->github.com/bradtraversy/mongochat/blob/…
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2018-10-19
    • 2020-11-13
    • 1970-01-01
    • 2019-04-08
    • 2023-03-24
    相关资源
    最近更新 更多