在节点js中的Socket.io中为特定用户发出事件

时间:2019-01-13 13:44:17

标签: javascript node.js sockets socket.io

我分别使用方法socket.onio.emit进行请求和响应。目前,我面临的问题是我得到了所有用户的响应。 我只想通知特定用户。但是,当我问有关stackoverflow的上述问题时,有人要求我点击this链接。但是在上面的链接中,提到了我们需要一个用户ID,当用户登录到我们的应用程序时我可以获取该用户ID 。请查看我的 server.js router.js 文件代码。

router.js

const express = require('express');
const router = express.Router();
const passport = require('passport');

const userController = require('../controllers/user');

router.route('/auth/login')
  .post(
    userController.login
  );

router.route('/users')
  .get(
    passport.authenticate('jwt', { session: false }),
    userController.getUsers
  );

module.exports = router;

server.js

const express = require('express');
const router = require('./router');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

var server = require('http').Server(app);
var io = require('socket.io')(server);    
server.listen(PORT, () => {
  console.log(`\tListening on port ${PORT}!`);
});
app.io = io;
app.use('/api', router);

注意:有人可以立即告诉我,如果我已经注册并登录我的应用,如何为特定用户发出事件。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情

let sockets = [];

    io.on("connection", function(socket) {
      socket.on("online", data => {
        socket.name = data.username;
        sockets[data.username] = socket.id;
      });
      socket.on("message", function(data) {
        socket.broadcast.emit("public", data);
      });

      socket.on("send_personal_message", function(data) {
        socket.to(sockets[data.user]).emit("personal", data);
      });

      socket.on("disconnect", reason => {
        sockets.splice(sockets.findIndex(id => id === socket.id), 1);
      });
    });

在send_personal_message中,您将从数据对象内的发件人那里收到用户名。以下代码将帮助您向选定的用户发送消息。

socket.to(sockets[data.user]).emit("personal", data);

答案 1 :(得分:0)

[https://socket.io/docs/emit-cheatsheet/][1]

io.on('connect',onConnect);

onConnect(套接字)功能{

//发送给客户端   socket.emit('hello','你能听到我说话吗?',1,2,'abc');

//发送给除发件人以外的所有客户端   socket.broadcast.emit('broadcast','hello friends!');

//发送给“游戏”房间中的所有客户端,发件人除外   socket.to('game')。emit('nice game',“让我们玩一个游戏”);

//发送给“游戏1”和/或“游戏2”房间中的所有客户端,发件人除外   socket.to('game1')。to('game2')。emit('nice game',“让我们一起玩一个游戏”);

//发送给“游戏”室中的所有客户端,包括发送方   io.in('game')。emit('big-announcement','游戏即将开始');

//发送到名称空间“ myNamespace”中的所有客户端,包括发送者   io.of('myNamespace')。emit('bigger-announcement','比赛即将开始');

//发送到特定名称空间中的特定房间,包括发送者   io.of('myNamespace')。to('room')。emit('event','message');

//发送到单独的socketid(私人消息)   io.to(${socketId})。emit('hey','I just met you');

//警告:socket.to(socket.id).emit()将无法发送,因为它将发送给会议室中的每个人   //名为socket.id,但为发件人。请改用经典的socket.emit()

//带有确认发送   socket.emit('question','您是否认为呢?',function(answer){});

//不压缩发送   socket.compress(false).emit('uncompressed',“那很粗糙”);

//发送一条消息,如果客户端尚未准备好接收消息,则该消息可能会被丢弃   socket.volatile.emit('也许','您真的需要吗?');

//指定要发送的数据是否具有二进制数据   socket.binary(false).emit('what','我没有二进制文件!');

//发送到该节点上的所有客户端(使用多个节点时)   io.local.emit('hi','my cute babys');

//发送给所有连接的客户端   io.emit('一个事件发送给所有连接的客户端');

};

这是一个io的清单cheatsheet。一种方法是通过用户唯一ID创建ROOM并将其加入。因此,每当您向该ROOM中发送某些内容时,该特定用户就会获得该msg。创建ROOM更加容易,因此在以后的部分中,您只需检查用户在线和离线工作的ROOM。这个概念可以像watsapp一样适用于一个用户和多个用户组。