Вызов API socket.io из внешнего файла - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь вызвать мой Socket.io интерфейс из другого файла с express маршрутами.Допустим, я хочу создать следующий групповой чат с этим и затем отправить уведомление вовлеченным пользователям в групповом чате:

rout.js

    router.post(
  "/save-groupchat",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    new GroupChat({
      creator: req.user._id,
      groupName: req.body.groupName,
      groupMembers: userList
    })
      .save()
      .then(newGroup => {
        GroupChat.findOne(newGroup)
          .populate("groupMembers.user")
          .then(groupChat => {
            //Notify the user's as well
            userList.map((user, key) => {
              NotificationCenter.findOneAndUpdate(
                { owner: user.user },
                {
                  $push: {
                    notifications: {
                      $each: [
                        {
                          type: "group-invite",
                          title:
                            "You have been invited to " +
                            req.body.groupName +
                            " by " +
                            req.user.name,
                          notificationTriggeredBy: req.user._id
                        }
                      ],
                      $position: 0
                    }
                  }
                }
              )
                .then(() => {
                    //How do I call the socket here <---------------------------------
                  console.log("Notified User: " + req.body.userList[key].name);
                })
                .catch(err => {
                  console.log(
                    "Error when inviting: " +
                      req.body.userList[key].name +
                      "\n " +
                      err
                  );
                });
            });

            res.json(groupChat);
          });
      });
  }
);

. / Microservice / chat /chat (Socket Interface)

И тогда мой сокет интерфейс выглядит следующим образом:

   let user_list = {};
      io.sockets.on("connection", socket => {
        socket.on("send-notification", notification => {
          console.log("How do I get here from the other file?");
        });
    })
...

Вот как у меня есть server.js файл

var http = require("http").Server(app);
var io = require("socket.io")(http);
ChatMicroservice = require("./microservice/chat/chat")(io);

Как быЯ получаю доступ к интерфейсу сокетов и использую user_list сокетов для отправки уведомлений?

1 Ответ

1 голос
/ 28 сентября 2019

Чтобы вызвать socket.io API из внешнего файла, вы должны либо создать класс singleton и экспортировать его, либо сохранить объект сокета в глобальную переменную и сохранить идентификатор подключенного сокета в базе данных, соответствующей пользователю.поэтому всякий раз, когда соединение с сокетом устанавливается на сервере, идентификатор сокета, т.е. socket.id, сохраняется в базе данных, соответствующей идентификатору пользователя.

, поэтому интерфейс вашего сокета становится

 global.io = io;
   io.sockets.on("connection", socket => {

    // add your method to save the socket id (socket.id) 
    // user-id passed can be accessed socket.handshake.query.userId


        socket.on("send-notification", notification => {
          console.log("How do I get here from the other file?");
        });
    })

В другом файле вызовите

global.io.to(id).emit(event, value);

Если вы планируете масштабировать приложение по горизонтали, используйте socket.io-redis в интерфейсе сокетов

 const redis = require('socket.io-redis');
 global.io.adapter(redis({ host: redisUrl, port: redisPort }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...