gpt4 book ai didi

sockets - 套接字发送给特定用户

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

我在同一主题上发现了几个问题,但没有一个主题对我有用。我想那是因为我在此过程中遗漏了一些东西:

我想向特定用户发送消息。
我用:

"express": "^4.13.3"
"socket.io": "^1.3.7"
"socket.io-client": "^1.3.7"
"mongodb": "^2.2.2"
"mongoose": "^4.5.4"

这是我的代码:

服务器(如您所见,我使用 Mongoose 来处理 session ):
const io = new SocketIo(server);

io.use(socketioJwt.authorize({
secret: configSocket.secret,
handshake: true
}));

// persistence store of our session
const MongoStore = mongoStoreFactory(session);

const sessionMiddleware = session({
store: new MongoStore({
mongooseConnection: mongoose.connection,
ttl: (1 * 60 * 60) // 1 hour
}),
secret: configSocket.secretSession,
httpOnly: true,
resave: false,
saveUninitialized: false,
// rolling: true,
// secure: true,
cookie: { maxAge: 86400000 }
});
app.use(sessionMiddleware);

...

socketRouter(io);

然后是socketRouter函数。我将用户配置文件的socketId与mongo dataStore一起存储,以使用户瞄准emit。
exports = module.exports = (io) => {
io.sockets.on('connection', (socket) => {
Users.findById(socket.decoded_token.sub, (err, user) => {
if (user) {
// if the user exists, save the socket Id in the user collection
Users.update({_id: user._id}, {$set: {socketId: socket.id}}, (err2, result) => {

// ------ PROTECTED ROUTES ------ //

// MOBILE CALLS
...

// DASHBOARD CALLS
socket.on('forceNotif', (data) => Notif.force(data, io, socket));

// ------------------------------ //
});
}
});
socket.on('disconnect', ()=> {
Users.update({_id: socket.decoded_token.sub}, {$set: {socketId: null}});
});
});

由“forceNotif”调用的函数。在这里,我期望一种不同的行为。我希望套接字将值发送给特定用户(不同于发送请求的用户)。我从MongoDb检索socketId,这是正确的。然后,我想将其用于我的目的。网络上提出了几种不同的主张。我测试了以下内容:
exports.force = (par, io, socket) => {
// retrieve the socket id of the user to aim
Users.findOne({_id: par.id}, {socketId: 1, pseudo: 1}, (err, res) => {
console.log('--------------------------------------------------');
console.log('err: ', err);
console.log('pseudo: ', res.pseudo);
console.log('socketId: ', res.socketId);
// emit the value to a specific user


// not working

io.sockets.to(res.socket).emit('notifExtUpdate', {val: 'TO'});
io.to(res.socket).emit('notifExtUpdate', {val: 'TO'});
io.broadcast.to(res.socket).emit('notifExtUpdate', {val: 'TO'});
socket.broadcast.to(res.socket).emit('notifExtUpdate', {val: 'TO'});
socket.to(res.socket).emit('notifExtUpdate', {val: 'TO'});


// working well, but not my purpose

io.emit('notifExtUpdate', {val: 'BROADCAST'});
socket.broadcast.emit('notifExtUpdate', {val: 'BROADCAST'});
});
};

我希望有人可以帮助我:-)

最佳答案

所以在这里我找到的解决方案:
套接字documentation表示“每个套接字自动加入ID标识的房间”。但是由于某些原因,我仍然不明白,当我以下面的方式发出消息时(在其中,通过mongoDb存储,检索和检查了socketId),什么也没发生:

socket.broadcast.to(socketId).emit('blabla', msg);

但是最后,我通过以下方式将用户手动加入到个人房间中:
  io.on('connection', (socket) => {
Users.findById(socket.decoded_token.sub, (err, user) => {
if (user) {
// create a room for every user
socket.join(user._id);

socket.on('exemple', (data) => functionExemple(data, io));
...

然后我可以像这样在functionExemple中向特定用户发出命令(其中targetId是集合中用户的_id):
exports.functionExemple= (par, io) => {
returnEmit.to(targetId).emit('blabla', msg);
};

我希望它会帮助某人:-)

关于sockets - 套接字发送给特定用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45032165/

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