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

Javascript 在节点js的Socket.io中为特定用户发出事件,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,我使用了方法socket.on和io.emit分别用于请求和响应。目前我面临的问题是我得到了所有用户的响应。 我只想通知特定用户。但当我在stackoverflow上问上述问题时,有人让我跟随链接。但在上面的链接中提到,我们需要一个用户Id,当用户登录到我们的应用程序时,我可以得到这个Id。请查看我的server.js和router.js文件代码 router.js const express = require('express'); const router = express.Router

我使用了方法
socket.on
io.emit
分别用于请求和响应。目前我面临的问题是我得到了所有用户的响应。 我只想通知特定用户。但当我在stackoverflow上问上述问题时,有人让我跟随链接。但在上面的链接中提到,我们需要一个用户Id,当用户登录到我们的应用程序时,我可以得到这个Id。请查看我的server.jsrouter.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;
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(`Try something like this

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);
      });
    });
server.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;
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(`Try something like this

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);
      });
    });
const express=require('express');
const router=require('./路由器');
const bodyParser=require('body-parser');
常量app=express();
use(bodyParser.json());
var server=require('http')。服务器(应用程序);
var io=require('socket.io')(服务器);
服务器。侦听(端口,()=>{

log(`试试这样的方法

socket.to(sockets[data.user]).emit("personal", data);
在send_personal_message(发送个人消息)中,您将从数据对象中的发件人处接收用户名。以下代码将帮助您向选定用户发送消息

[https://socket.io/docs/emit-cheatsheet/][1]
io.on('connect',onConnect)

函数onConnect(套接字){

//发送到客户端 emit('hello','you couldn me?',1,2,'abc')

//发送到除发件人以外的所有客户端 socket.broadcast.emit('broadcast','hellofriends!')

//发送至“游戏”室中的所有客户端(发件人除外) socket.to('game').emit('nice game','let's play a game')

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

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

//正在发送到命名空间“myNamespace”中的所有客户端,包括发件人 io.of('myNamespace').emit('biger-announcement','比赛即将开始')

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

//发送到单个socketid(私人消息) io.to(
${socketId}
).emit('hey','I just meet you')

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

//确认发送 emit('question','doyouthink?',function(answer){})

//无压缩发送 socket.compress(false).emit('uncompressed','that's rough')

//发送一条在客户端未准备好接收消息时可能被删除的消息 socket.volatile.emit('maybe','您真的需要它吗?')

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

//发送到此节点上的所有客户端(使用多个节点时) io.local.emit(‘嗨’、‘我可爱的宝贝’)

//发送到所有连接的客户端 io.emit(“发送到所有连接客户端的事件”)

})


这是一个socket io emit备忘单。一种方法是通过用户唯一id创建一个文件室并加入该文件室。因此,每当您向该文件室发送某些内容时,该特定用户将获得该消息。创建文件室更为简单,所以后面的部分您只需检查该文件室中的用户在线、离线和其他工作。此概念适用于一个用户和多个用户我也想知道同样的情况。