使用 socket.io 向特定用户发送更新通知

2024-01-11

以下是前端代码,其中storeSelUserId包含发送消息的 user_id -

FYI- 节点版本1.1.0

// Socket Notification
var socket = io('http://localhost:6868');
socket.on('connection', function (data) {
    socket.emit('send notification', { sent_to: storeSelUserId });
});

以下是路由文件中的服务器代码 -

var clients = {};  
io.on('connection', function (socket) {
  socket.emit('connection', "Connection Created.");
  socket.on('send notification', function (sent_to) {
    console.log(sent_to);
  });
});

在控制台中sent_to显示的是数组user_id.

现在是首发socket.io我坚持使用如何将消息发送到这些特定用户 ID 的解决方案。

我搜索并发现我需要用其套接字推送每个用户,所以我将其改造为 -

var users = [];  
io.on('connection', function (socket) {
  users.push({socket_id: socket.id});
  socket.emit('connection', "Connection Created.");
  socket.on('send notification', function (sent_to) {
    console.log(sent_to);
  });
});

但我陷入困境,我还需要做些什么来存储哪些user_id引用哪个socket_id,然后用该特定id更新用户的div?

EDIT -

添加控制器 - (前端)

创建备忘录并将其发送给特定用户的前端界面

var socket = io('http://localhost:6868');
socket.on('connection', function (data) {
    socket.emit('send memo notification', {creator_id: creator_id, sent_to: [Array of user_ids to whom memo to send]});
});

仪表板控制器 -(前端)

通知计数显示“通知计数”的前端界面

if (SessionService.currentUser._id) {
    var socket = io('http://localhost:6868');
    socket.on('connection', function (data) {
        socket.emit('get notifications', {user_id: SessionService.currentUser._id});
    });

    socket.on('notification data', function(data){
        console.log("-- Not Data Test -");
        $scope.notificationCount = data.length;
    });
}

服务器端的代码 -

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

  socket.emit('connection', "Connection Created.");

  socket.on('send memo notification', function(data) {
        notifications.createNotification(data);
  });

  socket.on('get notifications', function(data){
    notifications.getNotifications(data, function(response){
        socket.emit('notification data', response.data);
    });
  });

});

后端控制器代码 -

exports.getNotifications = function(data, callback) {
    var userId = data.user_id;
    Notification.find({receiver_id: userId}, function(err, response){
        if (err)
            callback({"message": "error", "data": err, "status_code": "500"});
        else
            callback({"message": "success", "data": response, "status_code": "200"});
    });  
};

exports.createNotification = function(data) {
    var notificationData = data;
    var x = 0;
    for(var i=0; i< notificationData.length; i++) {
        // Code
        Notification(notificationData[i]).save(function(err,response){
            if (err)
                return false;
        });    
        if (x === notificationData.length - 1) {
            return true;
        }
        x++;
    }
};

如果您想使用自己的用户 ID,则无法将套接字 ID 映射到用户 ID。我假设客户端从某处知道其用户 ID,因此它可以在连接后将其用户 ID 发送到服务器。

Client

socket.on('connection', function (data) {
    socket.emit('setUserId', myUserId);
});

服务器保存每个用户 ID 的套接字。

socket.on('setUserId', function (userId) {
    users[userId]=socket;
});

如果服务器中有这样的映射,您可以使用用户 ID 向该客户端发送消息。

socket.on('send notification', function (userId) {
     users[userId].emit('notification', "important notification message");
});

编辑:直接保存相应的套接字更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 socket.io 向特定用户发送更新通知 的相关文章

  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • Electron — 无法显示自定义图标

    我在以两种不同的方式设置 Electron 应用程序的图标时遇到问题 非打包 通过终端运行应用程序 我的 main js 确实指定了一个 图标 值 指向图标文件 但它不适用 包装 使用电子包装器 我的 package json 文件指定了
  • java.net.SocketException:无效参数:与 BungeeCord 连接

    我编写了一个使用 gRPC 连接到服务器的 Java 依赖项 在我的 spigot 插件和普通 java 项目中使用此依赖关系工作正常 但在 BungeeCord 插件中使用它会产生以下异常 Caused by io grpc netty
  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • 有什么不同? .on“连接”与.on“连接”

    我很难理解以下之间的区别 io on connection function io on connect function 可能是一个相当原始的问题 但是我无法找到有关它的明确文档 很想了解其中的区别 这些是同一事物的不同名称 正如所写so
  • TypeError [ERR_INVALID_ARG_TYPE]:“listener”参数必须是 Function 类型

    我这里有一个小问题 events js 200抛出新错误 ERR INVALID ARG TYPE listener Function listener 类型错误 ERR INVALID ARG TYPE 侦听器 参数必须是类型 功能 收到
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • Sails.js - 如何更新嵌套模型

    attributes username type email validated by the ORM required true password type string required true profile firstname s
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 如何从@google-cloud/storage读取文件?

    我正在从我的存储桶中检索文件 我收到该文件并想要阅读其内容 但我不想将其下载到我的本地项目 我只想读取内容 获取数据并用它进行其他操作 我的代码 export const fileManager async gt try const sou
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • 在 mongodb 和 nodejs 中对博客和评级进行建模

    我有一个博客集合 其中包含用户给予的标题 正文和综合评分 另一个集合 评级 其架构引用了博客 以对象 ID 的形式对博客进行评级 如果有的话 的用户以及他们给出的评级 即 1 或 1 当特定用户按照 最新优先 的顺序浏览博客时 比如每页 4
  • 使用 ObjectId 键和字符串数组定义映射作为 mongoose 模式中的值

    我在为数据库创建 Mongoose 架构时遇到问题 我想创建一个以 objectId 作为键 以字符串值数组作为值的映射 我能得到的最接近的是 var schema new Schema map myId type mongoose Sch
  • Node.JS async.parallel 不会等到所有任务完成

    我在用异步并行 https github com caolan async并行运行两个函数 这些函数请求 RSS 源 然后 RSS 提要被解析并添加到我的网页中 但由于某种原因async parallel运行回调方法而不等待两个函数完成 文
  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • Node.js Express 4.0 中的 res.render 回调参数的用途是什么?

    目的是什么res render回调参数 在什么情况下 由于模板已被指定为第一个参数 因此人们会想要使用这样的回调参数 这是文档中的代码 send the rendered view to the client res render inde
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • 使用 Express.js 和 NodeJS,您可以通过响应正文中的重定向发送 JSON

    我正在尝试通过 302 重定向发送 JSON 在 ExpressJS 中这可能吗 API 声明可以添加主体res json 例如 res json 302 name larry 在接收端 重定向的目的地 主体是空的 这是一些示例代码 发送应

随机推荐