gpt4 book ai didi

node.js - socket.io使用相同的套接字ID连接

转载 作者:行者123 更新时间:2023-12-03 12:02:31 25 4
gpt4 key购买 nike

当前端在服务器之前加载时,我的套接字会产生问题,
我的问题是
1,我从多个客户端的cookie中获得相同的socketid
2.我只有一个从服务器连接了多个套接字ID的客户端
3,当我遇到这个问题时,我的API调用将无法使用,并且我也不会从数据库中获取任何数据
重新启动服务器时,以及使用不同的客户端多次刷新前端时,也会遇到此问题
我的服务器端代码

const mongoose = require("mongoose");
express = require("express");
app = express();
bodyParser = require("body-parser");
cookieParser = require("cookie-parser");
cors = require("cors");
user = require("./routes/user");
message = require("./routes/message");
http = require("http");
server = http.createServer(app);
io = require("socket.io")(server);
var userdata = require("./controllers/user");

mongoose
.connect(process.env.DATABASE, {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
})
.then(() => {
console.log("DB CONNECTED");
})
.catch((err) => console.log(err));

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(cors());
app.use(express.json());
app.use("/use", user);
app.use("/use", message);

let users = [];

io.on("connection", (socket) => {
socket.on("done", () => {
let userdata = require("./controllers/user");
console.log("connected");
userdata.userdata &&
users.push({ userid: userdata.userdata._id, socketid: socket.id });
console.log(users);
});

socket.broadcast.emit("message");
socket.on("more", function (c) {
console.log(c.a, c.b);
let d = users.find((s) => s.userid === c.b);
if (d) {
return io.to(d.socketid).emit("message", c);
}
});

socket.on("disconnect", () => {
console.log(socket.id);
if (users) {
for (let e = 0; users.length; e++) {
if (users[e] && users[e].socketid === socket.id) {
return users.splice(e, 1);
}
}
}
console.log(users);
return console.log("disconnected");
});
});
// app.use();
const port = process.env.PORT || 8000;

server.listen(port, () => {
console.log(`app is running at ${port}`);
});
我发现我的问题是由 userdata 引起的,当我删除了与 userdata 相关的所有内容时,即使重新加载服务器也没有任何问题。
这里 用户数据来自一个名为 isSignedIn 的中间件,该中间件在此网页上的每个API调用之前被调用,因此 用户数据被前端代码频繁更新。这是我的 isSignedIn 函数
exports.isSignedIn = async (req, res, next) => {
const header = req.headers["authorization"];
const token = header && header.split(" ")[1];
if (!token) return res.json("no token");
jwt.verify(token, "jsdhbcjsd", (err, User) => {
if (err) return res.json(`${err} not signedin`);
req.User = User;
exports.userdata = User;
next();
});
};
我尝试调用 isSignedIn()而不是导入 用户数据,这会更好,但是我从 header 中遇到错误,因此无法调用此函数。
调用此函数时出现错误 isSignedIn()
Promise {
<rejected> TypeError: Cannot read property 'headers' of undefined
at exports.isSignedIn (D:\message\backend\controllers\user.js:86:22)
它讲述了这条线
 const header = req.headers["authorization"];
我确保仅在使用await调用API后才能在前端连接套接字,以便在连接到套接字之前更新 用户数据。我已经在控制台中对其进行了测试,套接字仅在调用API后才连接
async componentDidMount() {
//my API calls
await this.friends(token);
await this.findfriends(token);

//connect the socket
this.start();
this.recieve();
}}
我的前端代码
const client = require("socket.io-client");
var socket
export default class Home extends Component {
constructor(props) {
super(props);
this.start = this.start.bind(this);
this.send = this.send.bind(this);
this.recieve = this.recieve.bind(this);
this.friends= this.friends.bind(this);
this.findfriends= this.findfriends.bind(this);
}
start(){
socket=client("http://localhost:8000");
}
send(){
socket.emit("more", c)
}
recieve(){
socket.on("message", c)
}
async componentDidMount() {
//my API calls
await this.friends(token);
await this.findfriends(token);

//connect the socket
this.start();
this.recieve();
}}

render(){
return(my data)
}
}


最佳答案

考虑了一会儿无法请求 header 之后,我想,为什么在连接时无法从套接字获取用户ID,然后我尝试了这段代码,就可以正常工作了
客户端

 start = () => {
socket = client("http://localhost:8000");
socket.on("connect", () => {
return socket.emit("userinfo", this.state.User._id);
});
};
服务器端
 socket.on("userinfo", function (user) {
users.push({ userid: user, socketid: socket.id });
console.log("C O N N E C T E D");
});

关于node.js - socket.io使用相同的套接字ID连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63024166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com