【问题标题】:Notification system using socket.io使用 socket.io 的通知系统
【发布时间】:2020-09-24 06:22:23
【问题描述】:

我正在尝试为我的 Events Manager 网站创建通知系统。

  1. 每当用户登录并做某事(例如,如果他创建了一个事件),他创建了一个事件的通知应该发送给其他用户。通知应该在“ strong>/notification/:username' 已通过身份验证的页面(其中每个用户的用户名都是唯一的)。

  2. 此外,如果用户创建私人事件,则必须将通知发送给相关用户。

我正在使用 Nodejs(Express)、socket.io、Vanilla javascript、mysql。为此,如果我是正确的,我需要存储 clientid(在我的情况下,它是用户名)和数据库(mysql)中的socketid作为键值对。但是我对如何继续感到困惑?我不知道如何获取不同用户的 socketid 并存储在数据库中。我不知道如何进行。如果有人向我解释我应该做什么,我需要解决什么问题等,那就太好了。谢谢!

【问题讨论】:

  • socket.id 是一个暂时的东西。一旦用户点击刷新或转到不同的网页,socket.id 就会改变。更典型的是,您会在内存中而不是在 mysql 数据库中跟踪它。通常不需要持久化socket.id,因为它的持续时间永远不会超过您的服务器。集群设置可能会集中存储 id,因此集群中的任何服务器都可以获取它(这通常通过像 redis 这样的基于内存的存储来完成)。
  • 好的,所以我没有使用redis。有没有为特定用户存储socketids?此外,如果除了使用 socket.id 之外还有其他方法可以解决此问题,您可以告诉我。谢谢
  • 有一个问题,你需要连接才能监听通知,并接收它们,如果socket断开你无法接收通知,所以你要找的不是socket .io 或套接字,您正在寻找推送通知(对此进行调查),是一种在用户未连接时也可用于处理通知的服务(如 whatsapp 通知),推送通知服务的一个示例是 onesignal,我使用 onesignal 与 ionic for android 一起工作,但我认为也可以用于网页。
  • 您能告诉我一些可以了解推送通知的资源吗?

标签: javascript mysql node.js express socket.io


【解决方案1】:

我将尝试向您解释一些可以继续进行的各种方法。

所以据我了解,您已经有一个用户系统连接到您的 mysql,所以您知道用户信息对吗?

所以我是你系统上的授权用户,我可以创建一个事件,当它公开时需要发送给每个人,对吗?

您可以使用以下内容:

io.emit('event-created', data);`

// so this part from server is gonna send everyone
// your frontend part should recieve this event.

socket.on("event-created", function(data) {
   // this is gonna be a public event anyway so everyone can see it
   // so here you have your newly created event's data so use it as needed =)
});

所以第二部分有点复杂,它需要是私有的吧?

你能做什么,你告诉我们你的用户名是唯一的,对吧?这样每个人都可以加入以他们的用户名命名的自己的房间,因此在您的连接中,您可以执行以下操作:

io.on("connection", (socket) => {
  // I'm assuming that you have a username here
  socket.join('uniq-username');
});

我们这里有什么可以为我说的,如果您想发送一个仅名为 halilcakar 的活动,这是我的用户名,您已经将我添加到我的房间。 你能做的就是

io.in('halilcakar').emit('some-event', { ...withSomeData });

当你在代码中的某个地方使用它时,如果我在线,这个事件将只有我可以看到。

那么我想再次说明什么,假设在创建私人事件时我们需要选择其中包含哪个用户,对吗?

让我们直接进入这段代码。

// this part is already in your connection

// create a private event
socket.on('private-event-created', data => {
  // here the data coming from frontend
  // while sending this down just make sure data 
  // has a property called users as usernames and array maybe?

  // since you created this event what you can do is send an emit to 
  // each user like following:

  data.users.forEach(username => io.in(username).emit('private-event', data));

  // So basicly we are sending this event to 
  // every user selected by the creator of this private event
  // again the part giving this ability is | .in(username) | this part
});

一切结束后,你需要从socket.io监听这个private-event事件

// so on frontend 
socket.on('private-event', function(data) {
   // here do the private events objectives. 
  // and the good part that even me(single user) 
  // I'll know who has this private-event by
  // data.users
});

我希望这会给你更多的想法:)) 请随时询问??

【讨论】:

  • 我有一个问题,但是在前端,如果我可以连接到用户频道,代码是:socket.join('username').on('event')
  • 嗨,David,基本上没有,frondend 上没有 join 方法。您只需监听来自前端的事件,后端决定是否发送事件:)
  • 我是新手,所以我很感兴趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多