javascript - (Node js) 如何向特定用户发送通知?

标签 javascript ajax node.js sockets socket.io

我有服务器代码 服务器.js

var socket  = require( 'socket.io' );
var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = socket.listen( server );
var port    = process.env.PORT || 3000;
var nik = {};

server.listen(port, function () {
  console.log('Server listening at port %d', port);
});


io.on('connection', function (socket) {
    socket.on( 'new_count_message', function( data ) {
        io.sockets.emit( 'new_count_message', {
            new_count_message: data.new_count_message
        });
    });

    socket.on( 'update_count_message', function( data ) {
        io.sockets.emit( 'update_count_message', {
            update_count_message: data.update_count_message
        });
    });

});

这就是我使用它的方式

$.ajax({
            type: "POST",
            url: "(some_url)",
            data: $("id_form").serialize(),
            dataType: "json",
            beforeSend:function(){
                alert('bla..bla..');
            },
            success: function (result) {
                if (result.status) {
                    var socket = io.connect('http://' + window.location.hostname + ':3000');
                    socket.emit('new_count_message', {
                        new_count_message: result.new_count_message
                    });
                } else if (result.status == false) {
                    alert(error);
                    return false;
                }
            },
            error: function(xhr, Status, error) {
                alert(error);
            }
        });

该功能运行良好,但它发送给所有人。如何向特定用户发送notif?我有要发送通知的 ID 用户

谢谢

最佳答案

嗯,

  • io.sockets.emit您向所有套接字发出一条消息。而是使用io.sockets.in("roomname").emit("message") .
  • 如果您有要发送消息的套接字 ID,则可以使用 io.sockets.connected["socketid"].emit("message") .
  • 如果您在io.on('connection')内函数并且您想将消息发送到同一个套接字,您可以简单地使用 socket.emit .

另一种方法是:

  • 当新的套接字连接时,将此套接字添加到特定房间 socket.join("UniqueUserId")socket.join("UniqueUserSessionId") ...然后使用第一个选项 io.sockets.in("UniqueUserId").emit("message")io.sockets.in("UniqueUserSessionId").emit("message")

示例:

io.on('connection', function (socket) {

    //get the unique socket socketId on connection
    var socketId = socket.id;
    //you can add this socket id to a Database to use it later, etc...

    //use sessionStore like Redis or memStore to get a unique sessionId

    //as well you can extract a cookie with the UserId (you need to secure this to be sure that the user not modified the cookie) (you can use 2 cookies 1 for the userid other for the encrypted password and check if the cookies data is the same than in your users Database) etc etc etc. User Session is a lot better). Read about nodejs session store and socket session. Something like...
    var cookies = qs.parse(socket.handshake.headers.cookie, "; ");
    var user_id = cookies.user_id; //or some other cookie name;
    socket.join(user_id);

    socket.on( 'new_count_message', function( data ) {

        //all sockets
        io.sockets.emit( 'new_count_message', {
            new_count_message: data.new_count_message
        });

        //same Socket
        socket.emit( 'new_count_message', {
            new_count_message: data.new_count_message
        });

        //specific Socket by SocketId
        //io.sockets.connected["socketid"].emit( 'new_count_message', {
        io.sockets.connected[socketId].emit( 'new_count_message', {
            new_count_message: data.new_count_message
        });

        //all sockets in a specific Room
        //io.sockets.in("roomname").emit( 'new_count_message', {
        io.sockets.in(user_id).emit( 'new_count_message', {
            new_count_message: data.new_count_message
        });

    });

});

关于javascript - (Node js) 如何向特定用户发送通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34651790/

相关文章:

javascript - 如何使用 startsWith 过滤并获取每个对象键的值?

php - 如何在客户端存储一个php数组?

javascript - 无法获取未定义或 null 引用的属性 isFunction

c# - Sys.WebForms.PageRequestManager pageLoaded事件缓存函数?

php - Symfony 3.2 FOSUserBundle Ajax 登录

javascript - 为什么 Next.js 自定义服务器禁用自动静态优化?

javascript - 从另一个对象创建新的且不同的对象的最佳方法

javascript - AJAX 到 .ASP 文件中丢失

node.js - 如何将 NPM 模块(十进制)添加到 ArangoDB 以进行 ACID 事务

javascript - everyauth with express (boilerplate) 应用程序