【问题标题】:How to persist data using expressjs, reactjs?如何使用 expressjs、reactjs 持久化数据?
【发布时间】:2018-10-26 08:06:51
【问题描述】:

我创建了一个简单的聊天应用程序。我想保留数据,所以每当我刷新它时,它也应该显示以前的聊天。目前,我正在使用 socket.io、reactjs 和 nodejs/express。当我刷新页面时,所有聊天都消失了,为什么会这样? 我认为我的后端在下面的代码中不起作用。目前,只有客户端在工作,而后端没有,为什么会这样? server.js 有什么问题?

代码:

server.js:

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

const app = express();

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

io = socket(server);

io.on('connection', (socket) => {
  console.log(socket.id);

  socket.on('SEND_MESSAGE', function(data){
      io.emit('RECEIVE_MESSAGE', data);
  })

});

聊天.js:

import React, { Component } from 'react'
import './chat.css'
import Icon, {
    Ionicons,
} from 'react-web-vector-icons'
import io from "socket.io-client";

export default class Chat extends Component {

    constructor(props){
        super(props);

        this.state = {
            message: '',
            messages: []
        };

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

        this.socket.on('RECEIVE_MESSAGE', function(data){
            addMessage(data);
        });

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

        this.sendMessage = ev => {
            ev.preventDefault();
            this.socket.emit('SEND_MESSAGE', {
                message: this.state.message
            })
            this.setState({message: ''});
        }

    }

    render() {
        return (
        <div>
                <div id="status"></div>
                <div id="chat">
                    <div className="card">
                        <div id="messages" className="card-block">
                            {this.state.messages.map(message => {
                                    return (
                                        <div className="msgCard">{message.message}</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>
        )
    }
}

注意:后端在端口 5000 上工作,客户端在 3000 上同时使用。 当我转到端口 5000 时,我收到错误 404,为什么会这样?

截图:

聊天应用:

【问题讨论】:

  • 嘿,我已经更新了我的答案,你现在检查了吗?

标签: javascript node.js reactjs express


【解决方案1】:

您必须将数据保存在某个地方。是的,没有数据库是可能的。在这里,我使用位于浏览器中的LocalStorage 实现了它。

this.state = {
        // Get previously saved messages.
        message: '',
        messages: JSON.parse(LocalStorage.getItem('messages')) || [],
    };


const addMessage = data => {
        console.log(data);
        this.setState({messages: [...this.state.messages, data]});
        console.log(this.state.messages);
        // Saving to HTML5 LocalStorage
        LocalStorage.setItem('messages' , JSON.stringify(this.state.messages);
    };

我希望它有所帮助。如果您遇到任何问题,请发表评论。

【讨论】:

    【解决方案2】:

    您的服务器代码不会在任何数据库中的任何位置存储聊天数据。它现在就像接收消息并向客户端发送消息的中间件一样。

    你正在监听 5000 端口,但你没有处理任何传入的请求,所以它抛出错误。

    【讨论】:

    • 但是使用 socket.io 时需要数据库吗?我没有使用任何数据库来存储聊天记录。
    • 没有数据库可以吗?
    • 这取决于您的要求。我们可以实现在客户端使用本地存储。但是如果你想访问访问聊天不同的客户端,那么我们需要存储在服务器端。
    【解决方案3】:

    先回答你的第二个问题:

    注意:后端在端口 5000 上工作,客户端在 3000 上同时使用。当我转到端口 5000 时,我收到错误 404,为什么会这样?

    您的 node/express/socket-io 后端在端口 5000 上运行。您的反应应用程序(提供 HTML/JS/CSS 文件)的开发服务器在端口 3000 上运行(我假设)。尝试使用浏览器(尝试通过 HTTP 协议获取文件)连接到 node/express/socket-io 后端会导致 404。

    如其他人所说,要保留较旧的消息,您需要使用 db.要么localStorage,将数据存储到PC、服务器端,你可以在内存存储中使用(只是push数组中的旧消息,并在用户连接时重播),或者像mongo、sql等实际的db。

    【讨论】:

    • 所以基本上我收到错误 404,因为它没有连接到任何数据库,对吗?
    • 我还有一个疑问 -> 即使我在端口 5000 上看到控制台,我也看不到任何东西,为什么会这样? server = app.listen(5000, function(){ console.log('server is running on port 5000') });为什么我去5000端口时不显示server is running on port 5000
    • app.listen(5000, function() { /* logging */ }) 运行监听socket-io 特定消息的后端(即期待来自socket-io 客户端的消息)。当您的浏览器 ping http://localhost:5000 时,因为服务器未配置为响应浏览器,这就是您收到 404 错误的原因。如果您想在浏览器中看到某些内容,可以在const app = express()app.listen 之间添加以下行:app.get('/', (req, res) =&gt; { res.status(200).send('OK') })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多