我分别使用方法socket.on
和io.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);
注意:有人可以立即告诉我,如果我已经注册并登录我的应用,如何为特定用户发出事件。
答案 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一样适用于一个用户和多个用户组。