使用 socket.io 更新使用通知

Posted

技术标签:

【中文标题】使用 socket.io 更新使用通知【英文标题】:update use notifications live with socket.io 【发布时间】:2018-04-29 21:00:57 【问题描述】:

您好,我正在尝试使用套接字 io 从数据库获取用户通知。 这是我尝试获取数据并将其发送回用户的方式

    if(req.user) 
    req.io.sockets.on('connection', function(socket)
    setInterval(getNotf,1000)
    function getNotf() 
    User.findOne(email:req.user.email)
    .then(user=>
        messages=(user.notifications);
        console.log(messages)
                   socket.emit('output', messages);
);
      

);

这种方式的问题是消息发送给所有连接的用户。我怎样才能将它们只发送给当前用户?

【问题讨论】:

【参考方案1】:

您可以使用其 Id 将消息发送到具有此连接的套接字:

io.to(socket.id).emit('output', messages)

在您的连接事件监听器中:

req.io.sockets.on('connection', function(socket)
    setInterval(getNotf,1000)
    function getNotf() 
    User.findOne(email:req.user.email)
    .then(user=>
        messages=(user.notifications);
        console.log(messages)
                   io.to(socket.id).emit('output', messages)
);

我有一个这样的连接的全局实例:

var serverhttp = http.createServer(<optionshttp>, app).listen(<port>);
var io = require('socket.io').listen(serverhttp);

作为 2 个连接的测试,您可以试试这个:

        var clients = [];

            req.io.sockets.on('connection', function(socket) 
                clients.push(socket.id);
                setInterval(getNotf,1000)
                function getNotf() 
                User.findOne(email:req.user.email)
                .then(user=>
                    messages=(user.notifications);
                    console.log(messages)
                    console.log("socket ID :",socket.id)
                    io.to(clients[0]).emit('output', "user1")
                    io.to(clients[1]).emit('output', "user2")
    //or
    //io.sockets.connected[clients[0]].emit('output', "user1") 
    //io.sockets.connected[clients[1]].emit('output', "user2") 

            );

【讨论】:

我也试过了,但如果用户已连接,消息也会发送到其他连接 您能否尝试记录您的连接的 socket.id,console.log("socket ID :",socket.id)。请告诉我你是如何测试这个多连接用例的? 这里是客户端的代码 var socket = io.connect(); socket.on("output", data => $("#temp").text(data.length) console.log(data) 对吗? 我会请你做这个作为测试。在客户端: var socket = io.connect("localhost:<port>") 它与来自服务器的 http://: io.sockets.connected[socket.id].emit('output', messages) 并请告诉我你的 package.json 文件中的 socekt.io 版本,并在我问你的服务器连接事件后记录 socket.id 你能试试我在我的答案中编辑的测试部分并告诉我你得到了什么

以上是关于使用 socket.io 更新使用通知的主要内容,如果未能解决你的问题,请参考以下文章

CloudFlare 和 socket.io

如何使用 Express、AngularJS、Socket.io 广播和获取通知?

使用 express.js 和 socket.io 构建推送通知系统的最佳方法

使用 Socket.IO 和 PHP 推送通知

Socket.io 私信通知

如何在 Socket.io 中向特定用户发送通知