我只想在UI Reactjs上从Mysql获得实时数据。这样用户就不必总是刷新它。在查看了一些帖子之后,最终创建了一个socket.io连接,以便客户端可以与服务器对话。这就是我想要进入的:
server.js
const express = require("express");
const http = require("http");
const socketIo = require("socket.io");
var assert = require('assert');
const port = process.env.PORT || 4001;
const index = require("./routes/index");
const app = express();
app.use(index);
const server = http.createServer(app);
const io = socketIo(server);
const mysql = require('mysql');
var startDate ;
var endDate ;
var loopVariable = 1;
io.on("connection", (socket) => {
console.log("New client connected");
const con = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'localstatus',
debug: false,
});
console.log('Connection established ',(loopVariable++));
socket.on("FromUI", (data) => {
startDate = data.startDate;
endDate = data.endDate;
});
var initial_result;
setInterval(() => {
con.query('SELECT * FROM table where start_time BETWEEN ? and ?', [ startDate, endDate ],(err,rows) =>
{
if(err) {
console.log ('error', err.message, err.stack)
}else {
}
if(JSON.stringify(rows) === JSON.stringify(initial_result)){
}else{
if(Changed(initial_result, rows)) {
var result = [];
for (var row in rows) {
var results = [];
results.push({
Id: rows[row].id,
status: rows[row].t_status,
});
result.push({ returnValue:"true",
object: {Id: rows[row].id,
status: rows[row].t_status,
}});
}
socket.emit('FromAPI', result);
}
initial_result = rows;
}
})
function Changed(pre, now) {
if (pre != now)
{
return true
}else{
return false
}}
}, 1000);
socket.on('disconnect', function() {
socket.disconnect();
loopVariable--;
});
});
server.listen(port, () => console.log(`Listening on port ${port}`));client.js
import React, { useState, useEffect, Component } from "react";
import socketIOClient from "socket.io-client";
import TableUsingReactTable from "./TableUsingReactTable.js";
const ENDPOINT = "http://localhost:4001";
export default function App(){
const [response, setResponse] = useState([]);
useEffect(() => {
const socket = socketIOClient(ENDPOINT);
try{
socket.on("FromAPI", data => {
setResponse(data);
});
}catch (error) {
console.log(error);
}
return () => {
socket.on("disconnect")
socket.disconnect();
};
}, []);
console.log(response)
return (<TableUsingReactTable response={response}></TableUsingReactTable>)
}我认为当选项卡关闭时套接字会断开连接,但是当选项卡没有使用时会发生什么呢?以及如何在不使用时禁用它?即使当所有选项卡都关闭时,RAM也会增加。当套接字关闭时,如何减少RAM?当很多人同时点击socket.io时,是如何表现的呢?此外,有时我确实要面对这样的问题:
code: 'ER_CON_COUNT_ERROR',
errno: 1040,
sqlMessage: 'Too many connections',
sqlState: undefined,
fatal: true怎么处理这个案子?我对此并不熟悉,也不了解如何进一步发展。有人能帮我吗?非常感谢。
发布于 2020-10-26 06:01:03
首先,对于这个用例,您实际上并不需要Socket.IO。服务器发送事件/EventSource API可以做到这一点,因为您只向一个方向发送数据。这给了您不需要加载Socket.IO库的好处。
现在,真正的问题是您要为每个单独的客户端创建一个单独的MySQL连接。与每次新客户端连接时调用mysql.createConnection()不同,您可以连接数据库一次。(在某些情况下,这是不合适的,但是由于您只是在执行一些基本的SELECT查询,所以这很好。)
https://stackoverflow.com/questions/64532129
复制相似问题