Javascript 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('

如何基于下面的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)

尚未测试,但首先要尝试一个简单的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
对象。您肯定不希望这样做。