javascript - 客户端如何从mongodb获取数据?

标签 javascript node.js reactjs mongodb

我无法在客户端显示数据。数据存储在 mongodb 集合中,但我无法在客户端发送数据。我想在客户端的两个用户之间发送对话数据,但我在控制台中收到空数组,为什么会这样? server.js 文件中的 .find() 是否错误?我添加了 server.js 和 chat.js (我想在其中显示数据的客户端文件)

服务器.js:

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');
  let conversation = db.collection('conversation'); 
  let user1,user2;

      socket.on('GET_USER', function (data) {
        console.log(data);
         user2 = data.user2;
      });

      socket.on('LOGGEDIN_USER', function(data) {
        console.log(data);
         user1 = data.user1;
      });

      socket.on('SEND_MESSAGE', function(data){

        let author = data.author;
        let message = data.message;
        let date = data.date;

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

            conversation.findOne({ $and :[{user1: user1}, {user2: user2}] }, function (err, existingConversation){
                if(existingConversation === null){
                  conversation.insert({user1: user1, user2: user2, conversation: [{author: author, message: message, date:date}] })
                }else{
                  conversation.update({user1: user1, user2: user2}, 
                    {$push: {conversation : { author : author ,message : message,date : date }}  })
                }
            })

        }
      });

    conversation.find({ $and : [ {user1: user1}, {user2: user2} ] }).sort({_id: 1}).toArray(function (err, res) {
      if(err){
          throw err;
      }
          // Emit the messages
      io.emit('RECEIVE_MESSAGE', res);
    })


  }) 

聊天.js:

componentDidMount() {
      this.props.fetchUsers();
      this.socket.on('RECEIVE_MESSAGE', data => {
          console.log(data);         <--- This shows empty array in browser console
          this.addMessage(data);
      });
    }

    sendMessage(event) {
      event.preventDefault();

      if(this.state.message !== ''){
        this.socket.emit('SEND_MESSAGE', {
            author: this.props.match.params.user,
            message: this.state.message,
            date: Date.now()
        });

        this.socket.emit('LOGGEDIN_USER', { user1: this.props.match.params.user});
      }
    };

    addMessage(data) {

      this.props.saveAuthor(this.props.match.params.user)
      this.props.saveMessages(data)

      this.setState({
        message: ''
      });

    };

    handleClick = (userName) => {
        this.socket.emit('GET_USER', { user2: userName });
    }

存储在数据库中的示例数据:

{
    "_id": {
        "$oid": "5be039cf2b04ba5594939d48"
    },
    "user1": "Aditya",
    "user2": "vineet",
    "conversation": [
        {
            "author": "Aditya",
            "message": "Hello from Aditya",
            "date": 1541421517633
        },
        {
            "author": "Aditya",
            "message": "This is second message from Aditya",
            "date": 1541421556047
        }
    ]
}

截图:

enter image description here

最佳答案

嗯,您与 connection 事件“同时”调用 conversation.find({ user1: user1 }),然后 user1现在是未定义。您可以将 console.log(user1) 放在查询上方来检查 user1 值:

console.log("Before find user query: ", user1)
conversation.find({ user1: user1 })....

输出日志=> 在查找用户查询之前:未定义,这是您发送给客户端的数据是空数组的原因。

修补程序:当您真正获得user1时,只需查询并向客户端发送数据

socket.on('LOGGEDIN_USER', function (data) {
    console.log(data);
    user1 = data.user1;

    conversation.find({ user1: user1 }).sort({ _id: 1 }).toArray(function (err, res) {
        if (err) {
            throw err;
        }
        // Emit the messages
        io.emit('RECEIVE_MESSAGE', res);
    })
});

关于javascript - 客户端如何从mongodb获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154914/

相关文章:

javascript - 选择元素的change()不起作用

javascript - 使用按钮打开对话框以获取一些用户输入

javascript - 如何简化变量代码?

javascript - 为什么在调用 foo.fn() 时 JS 不总是将 `this` 绑定(bind)到 `foo`?

javascript - 如何定位我想要使用 GPT 刷新的广告

javascript - 如何在 RingoJS 中创建守护进程?

node.js - Alexa AWS 错误 : task timed out after 3. 00 秒

node.js - 如何在 NodeJS 中使用 azure-devops-node-api 库将文件推送到 TFS?

javascript - webpack:如何将所有 scss 文件捆绑到一个 main.css 文件中

css - 在 Gatsby 中使用 ActiveClassName 和 CSS 模块向事件链接添加样式不起作用