![](/img/trans.png)
[英]Emit event for particular user if login functionality in application in Socket.io with Node.js
[英]Emit event for particular user in Socket.io in node js
我分別使用socket.on
和io.emit
方法進行請求和響應,目前我遇到了對所有用戶都響應的問題。 我只想通知特定用戶 。 但是當我問上述關於stackoverflow的問題時,有人要求我點擊此鏈接。 但是在上面的鏈接中,提到了我們需要一個用戶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);
注意:如果我已經注冊並登錄到我的應用,現在誰能告訴我,如何為特定用戶發出事件。
試試這個
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.