我的目标是= 用户点击好友请求,然后将其发送给目标用户。
我现在有两个问题
如何在不将路由器包裹在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只是因为我只希望目标用户收到通知,这是朋友请求。有什么想法吗?
答案 0 :(得分:1)
通常,socket.io绑定到app对象,可以从路由中的req对象访问。然后,您可以使用空间来选择要处理的特定套接字。所以你可以像这样访问它
你的app.js中的:
app.io = socket_io();
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.'));
}
});
当然,我省略了许多样板文件,但这是一种方法。