如何将套接字对象传递给路由?

时间:2016-01-26 13:03:49

标签: node.js express socket.io

我的目标是= 用户点击好友请求,然后将其发送给目标用户。

我现在有两个问题

如何在不将路由器包裹在module.exports = function(express, io) { var router = express.Router(); router.post('/add-friend', function(req, res, next) { var userId = req.body.userId; console.log(userId); User.update( { _id: userId, friendsRequested: { $ne: userId } }, { $push: { friendsRequested: { requestee: req.user._id } }, }, function(err, count) { if (err) return next(err); io.emit('friendsRequest', req.user); // I want to change io to socket res.json("success"); }); }); return router; }

中的情况下将套接字对象传递给路由器

我现在的代码

io.on('connection', function(socket) {
   socket.on() // <-- I want to pass it socket to the router
});

如果你看看io.emit,我的目标是将其改为socket

socket.emit('friendsRequest', req.user);

这样我才能做到

var routes = require('./routes.js') (express, io);
app.use(routes);

在server.js

{{1}}

如何在不将其包装的情况下传入套接字对象?

我之所以要传入socket只是因为我只希望目标用户收到通知,这是朋友请求。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

通常,socket.io绑定到app对象,可以从路由中的req对象访问。然后,您可以使用空间来选择要处理的特定套接字。所以你可以像这样访问它

你的app.js中的

app.io = socket_io();
在你的router.js

router.post('/add-friend', function(req, res, next) {

    //here you can access socket
    var socket = req.app.io.off('/add-friend');

    //or if your socket is in a room (room name could be the user Id)
    var socket = req.app.io.off('/add-friend').to('roomName');

    //or if your socket is connected via '/'
    var socket = req.app.io.off('/').to('roomName');

    var userId = req.body.userId;
    console.log(userId);

    User.update(
      {
        _id: userId,
        friendsRequested: { $ne: userId }
      },
      {
        $push: { friendsRequested: { requestee: req.user._id } },
      }, function(err, count) {
        if (err) return next(err);
        socket.emit('friendsRequest', req.user); // I want to change io to socket
        res.json("success");
      });

    });

   return router;
}

答案 1 :(得分:0)

你的套接字处理程序应该有点多样化并且有一个API。

套接字处理程序可以直接公开getSocketByUserId功能,甚至更具体的sendFriendRequest功能。

类似的东西:

var sendFriendRequest = require('./socket').sendFriendRequest;
var Promise = require('bluebird');
router.post('/add-friend/:userId', function(req, res, next) {

  // skipping the database stuff for this example
  sendFriendRequest(req.user, req.params.userId)
  .then(function() {
    res.json({message: 'request sent'})
  })
  .catch(next);
});

// And in './socket'
var sockets = {};

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

  // get userId somehow
  sockets[userId] = socket;
  // do other stuff
});
export function sendFriendRequest(requestor, userId) {

  if (sockets[userId]) {
    sockets[userId].emit({ type: 'friendRequest', from: requestor.id, fromUsername: requestor.username});
    Promise.resolve('Request sent.');
  } else {
    Promise.reject(new Error('User not connected.'));
  }
});

当然,我省略了许多样板文件,但这是一种方法。