如何使用 nodejs / express 将数据存储在 mongodb 中?

Posted

技术标签:

【中文标题】如何使用 nodejs / express 将数据存储在 mongodb 中?【英文标题】:How can I store data in mongodb using nodejs / express? 【发布时间】:2018-10-26 19:22:31 【问题描述】:

我使用 socket.io 创建了聊天应用程序,并且正在存储消息数组。每个数组对象都有messagedate。聊天应用程序仅在客户端工作,即当我刷新页面时,所有以前的聊天都消失了。如何以编程方式存储消息?在客户端使用 mongodb、nodejs/express 和 reactjs 吗?

代码:

server.js:

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

const app = express();

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

mongoose.connect(db, useNewUrlParser: true)
  .then(() => console.log('Mongodb connected...'))
  .catch( err => console.log(err));

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('SEND_MESSAGE', data => 
        io.emit('RECEIVE_MESSAGE', data);
      );

)

messageSchema.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);

聊天.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>
        )
    

截图:

我应该在 server.js 和 chat.js 中进行哪些修改,以便将聊天消息存储在 mongodb 数据库中。我是否需要创建 API 端点来存储和检索以前的聊天记录?注意:我在 mlab 中设置了 mongodb,数据库名称为 mongochat,集合名称 = chat

【问题讨论】:

【参考方案1】:

您可以尝试编辑您的 server.js,然后执行以下操作:

var messageSchema = require("path/to/schema");

.
. 
.

socket.on('SEND_MESSAGE', data => 
   io.emit('RECEIVE_MESSAGE', data);
   var newDate = new Date();
   const message = new messageSchema(
       'message': data,
       'date': newDate
   )
   message.save((err, data) => 
      if(err) //do something
      else // do whatever you want
   )
);

您还可以创建一个中间件,为您提供 MongoDB 和 APP 之间的简单服务。

【讨论】:

我无法得到这一行 -> message.save((err, data) =&gt; message.save 是特定于 mongodb 或 socket.io 的? 猫鼬专用,你可以这样做:message.save(function(err,data) ... )

以上是关于如何使用 nodejs / express 将数据存储在 mongodb 中?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS express - 如何在路由器内添加会话数据?

如何将 Express NodeJS 项目部署到 Centos 服务器?

nodejs / express:如何使用数据发布到外部表单?

NodeJS,express:将数据从一个页面发布到另一个页面

Node JS+Express:如何在 HTML(EJS) 中定义和使用 MySQL 数据?

使用 Jade、NodeJS、Express 的动态 html 页面