Javascript Nodejs访问全局范围内的嵌套变量
如何基于下面的NodeJS代码访问全局范围内的套接字Javascript Nodejs访问全局范围内的嵌套变量,javascript,node.js,scope,Javascript,Node.js,Scope,如何基于下面的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('
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)
尚未测试,但首先要尝试一个简单的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() ??
Express的
应用程序
和Socket.io互不相关
所以从根本上说,你不能在app.post
中使用socket
您需要识别客户。您可以使用它,它具有一个基本上连接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
});
然后使用socketid
app.post('/', function (req, res) {
io.to(req.user.socketid).emit('whatever');
});
注意:
io.to()
用于发射到房间,但默认情况下,每个套接字都连接到其socket.id
名为的同一房间,因此它可以工作 Javascript和socketIO专家>请告诉我为什么这个简单的解决方案不起作用。似乎
1定义一个全局指针
var _this=this;
2在我的socketIO处理程序中,引用套接字对象
_this.socket=socket;
最后,在app.post中,像这样访问套接字
_this.socket.emit(....
这几乎肯定是X/Y问题:您想做X,但您已经询问了Y(在全局范围内使用
socket
)。什么是X?谢谢!!即使这不起作用,但似乎经过深思熟虑,我不得不承认它是正确的;)app.post('/',function(req,res)是否会更改为app.post('/login',passport.authenticate('local')?@eco_bach签出更新的答案。不,passport.authenticate
仅用于记录/验证用户。它需要一个带有凭据的req.body
,因此它肯定不会在您的主路径中使用。请参阅下面我的备选答案socket
对象对于每个连接的客户端都是唯一的。如果将其设为全局对象,则全局对象将仅引用所连接的最新客户端的socket
对象。您肯定不希望这样做。