Express's app
и Socket.io не имеют ничего общего друг с другом.
Так что принципиально, вы не можете использовать socket
внутри app.post
.
Вам необходимо идентифицировать клиента. Вы можете использовать Паспорт , который имеет Плагин Socket.io , который по существу соединяет app.post
/ get
req.user
с socket.request.user
.
Примечание: это не обязательно должен быть аутентифицированный клиент с пользователем, выбранным из базы данных, подойдет только клиент с временным пользователем, хранящимся в памяти. Примерно так:
app.use(function(req, res, next) {
if (!req.user) { // if a user doesn't exist, create one
var id = crypto.randomBytes(10).toString('hex');
var user = { id: id };
req.logIn(user);
res.redirect(req.lastpage || '/');
return;
}
next();
});
var Users = {};
passport.serialize(function(user) {
Users[user.id] = user;
done(null, user);
});
passport.deserialize(function(id) {
var user = Users[id];
done(null, user);
});
Затем вы можете прикрепить идентификатор сокета клиента к его сеансу пользователя.
io.on('connection', function (socket) {
socket.request.user.socketid = socket.id
});
А затем вместо socket.emit
используйте io.emit
в app.post
, используя socketid
app.post('/', function (req, res) {
io.to(req.user.socketid).emit('whatever');
});
Примечание: io.to()
используется для передачи в комнату , но каждый сокет по умолчанию присоединяется к той же комнате, которая называется socket.id
, поэтому он будет работать.
спасибо: https://stackoverflow.com/questions/28310418/nodejs-accessing-nested-variable-in-global-scope