如何使用 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 创建了聊天应用程序,并且正在存储消息数组。每个数组对象都有message
和date
。聊天应用程序仅在客户端工作,即当我刷新页面时,所有以前的聊天都消失了。如何以编程方式存储消息?在客户端使用 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) =>
message.save 是特定于 mongodb 或 socket.io 的?
猫鼬专用,你可以这样做:message.save(function(err,data) ... )
以上是关于如何使用 nodejs / express 将数据存储在 mongodb 中?的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS express - 如何在路由器内添加会话数据?
如何将 Express NodeJS 项目部署到 Centos 服务器?
nodejs / express:如何使用数据发布到外部表单?
NodeJS,express:将数据从一个页面发布到另一个页面