使用socket.io的通知系统

lok*_*san 1 javascript mysql node.js express socket.io

我正在尝试为我的活动管理器网站创建一个通知系统。

  1. 每当用户登录并执行某些操作(例如,如果他创建了一个事件),他已创建事件的通知应发送给其他用户。通知应在“ /notification/:username ”页面中提供这是经过身份验证的(其中每个用户的用户名都是唯一的)。

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

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

hal*_*kar 6

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

所以根据我的理解,你已经有一个连接到你的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 =)
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

我们在这里可以对我来说,如果您想发送仅名为此的事件,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
});

Run Code Online (Sandbox Code Playgroud)

private-event完成所有操作后,您需要从 socket.io监听此事件

// 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
});
Run Code Online (Sandbox Code Playgroud)

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