【发布时间】:2021-09-30 20:26:39
【问题描述】:
我正在制作一个以节点为后端的反应应用程序。他们使用 socket-io 进行通信。我遇到的问题是 react 确实和 emit 将数据发送到节点,但是做了两次,从而进行了双重提交。例如,使用登录表单,终端输出如下所示:
[nodemon] starting `node --trace-warnings central-server.js`
web server running on port 5000
client GuRD1JAb_J1xn4O4AAAB successfully connected
{ CompanyID: 'BigCompany', Password: 'SecretPassword' }
{ CompanyID: 'BigCompany', Password: 'SecretPassword' }
这是前端应用程序:
import { useState } from "react";
import Form from "./components/Signup-Form.js";
import { io } from "socket.io-client";
const socket = io("http://192.168.43.118:5000", {
withCredentials: true,
extraHeaders: {
"react-client": "react-client",
},
});
function App() {
const [userData, setUserData] = useState({});
if (Object.entries(userData).length === 0) {
return (
<div className="App">
<div className="textContainer">
<h1>Welcome</h1>
<h3>You can Log in or Sign Up here</h3>
</div>
<Form setUserData={setUserData} />
</div>
);
} else {
socket.emit("signup", userData);
return <p>Data sent successfully</p>;
}
}
export default App;
服务器:
var express = require("express");
var app = express();
var server = require("http").Server(app);
const dotenv = require("dotenv");
dotenv.config();
const WS_PORT = process.env.PORT || 5000;
const io = require("socket.io")(server, {
cors: {
origin: ["http://localhost:3000", "http://192.168.43.118:3000"],
methods: ["GET", "POST"],
transports: ["websocket", "polling", "flashsocket"],
allowedHeaders: ["react-client"],
credentials: true,
},
});
io.on("connection", (socket) => {
console.log(`client ${socket.id} successfully connected`);
socket.on("signup", (data) => {
console.log(data);
});
});
server.listen(WS_PORT, () => console.log("web server running on port", WS_PORT));
App.js 文件是目前唯一使用套接字的文件。此外,当我保存文件并且服务器自动重新加载时,我让客户端创建了 3 次连接,而不仅仅是一次。
【问题讨论】:
标签: javascript node.js reactjs sockets socket.io