如何根据以下NodeJS代码访问全局范围内的套接字
io.on('connection', function (socket) {
console.log('connection '+socket)
socket.on("data",function(d){console.log('data from flash: ',d);});
socket.emit("message","wtfwtwftwftwf hello from server");
socket.on('disconnect', function (socket) {
console.log("disconnect");
});
});
我需要从以下app.post方法
中访问套接字var express = require('express'),
multer = require('multer');
var app = express();
//auto save file to uploads folder
app.use(multer({ dest: './uploads/'}))
app.post('/', function (req, res) {
console.log(req.body); //contains the variables
console.log(req.files); //contains the file references
res.send('Thank you for uploading!');
});
app.listen(8080);
Haven尚未测试,但首先尝试使用简单的getter功能
io.on('connection', function (socket) {
console.log('connection '+socket)
socket.on("data",function(d){console.log('data from flash: ',d);});
socket.emit("message","wtfwtwftwftwf hello from server");
return{
getSocket: function(){
return socket;
}
};
socket.on('disconnect', function (socket) {
console.log("disconnect");
});
});
io.getSocket() ??
答案 0 :(得分:1)
Express' app
和Socket.io彼此无关。
所以从根本上说,你不能在socket
内使用app.post
。
您需要识别客户端。您可以使用Passport Socket.io plugin,{{3}}基本上将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);
});
然后,您可以将客户端的套接字ID附加到其用户会话。
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
用于向会议室发出内容,但默认情况下,每个套接字都会加入到名为{{1}}的同一个会议室中,因此它会被发送到{{1}}。工作。
答案 1 :(得分:0)
Javascript和socketIO专家>请告诉我为什么这个简单的解决方案不起作用。好像......
1定义全局指针
var _this=this;
2在我的socketIO处理程序中引用套接字对象
_this.socket=socket;
3最后在app.post中,像这样访问套接字
_this.socket.emit(....