簡體   English   中英

在節點js中的Socket.io中為特定用戶發出事件

[英]Emit event for particular user in Socket.io in node js

我分別使用socket.onio.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;

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);

注意:如果我已經注冊並登錄到我的應用,現在誰能告訴我,如何為特定用戶發出事件。

試試這個

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);
[https://socket.io/docs/emit-cheatsheet/][1]

io.on('connect',onConnect);

onConnect(socket)功能{

//發送到客戶端socket.emit('hello','你能聽到我說話嗎?',1,2,'abc');

//發送給除發件人socket.broadcast.emit('broadcast','hello friends!')外的所有客戶端;

//發送給“游戲”房間中的所有客戶端,但發送者socket.to('game')。emit('nice game',“我們來玩游戲”);

//發送給'game1'和/或'game2'房間中的所有客戶端,除了發送方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','我剛認識你');

//警告: socket.to(socket.id).emit()將不起作用,因為它將發送給房間中每個名為socket.id但發送給發送者。 請改用經典的socket.emit()

//發送確認信息socket.emit('question','您認為這樣嗎?',function(answer){});

//發送時不帶壓縮socket.compress(false).emit('uncompressed',“那很粗糙”));

//發送一條消息,如果客戶端尚未准備好接收消息,則該消息可能會被丟棄socket.volatile.emit('maybe','您真的需要嗎?');

//指定要發送的數據是否具有二進制數據socket.binary(false).emit('what','I no binaries!');

//發送到該節點上的所有客戶端(使用多個節點時)io.local.emit('hi','my lovely babies');

//發送給所有連接的客戶端io.emit('一個事件發送給所有連接的客戶端');

};

這是一個套接字ocduct-cheatsheet。 一種方法是通過用戶唯一ID創建ROOM並將其加入。 因此,每當您向該ROOM中發送某些內容時,該特定用戶就會獲得該msg。 創建ROOM更加容易,因此在以后的部分中,您只需檢查用戶在線和離線工作的ROOM。 這個概念可以像watsapp一樣適用於一個用戶和多個用戶組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM