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

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

我现在有两个问题

如何将套接字对象传递给路由器而不把路由器包装在io.on('connection', function())

我现在的代码

 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.emit,我的目标是把它改成socket

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

所以我可以做

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

在server.js中

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

我如何传递套接字对象而不包装呢?

我只想通过套接字的原因是因为我只想要目标用户收到通知,这是朋友请求。 对此有何想法?

通常情况下,socket.io绑定到应用程序对象,并可以从路线中的req对象访问。 然后,您可以使用空间来select要处理的特定套接字。 所以你可以像这样访问它

在你的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; } 

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

套接字处理程序可以直接暴露getSocketByUserIdfunction,甚至更具体地说,是一个sendFriendRequestfunction。

就像是:

 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.')); } }); 

当然,我已经省略了许多样板文件,但这是一个办法。