Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 访问快速路线时加入socket.IO房间_Javascript_Node.js_Express_Socket.io - Fatal编程技术网

Javascript 访问快速路线时加入socket.IO房间

Javascript 访问快速路线时加入socket.IO房间,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,在访问我的Express应用程序中的特定路径时,加入socket.IO文件室时遇到问题 因此,我目前有以下设置: app.js var express = require('express'); var app = express(); var http = require('http').Server(app); var socketio = require('socket.io').listen(http); var socketjs = require(libs + 'sockets/so

在访问我的Express应用程序中的特定路径时,加入socket.IO文件室时遇到问题

因此,我目前有以下设置:

app.js

var express = require('express');
var app = express();
var http = require('http').Server(app);
var socketio = require('socket.io').listen(http);
var socketjs = require(libs + 'sockets/socket.js');

...

var server = http.listen(app.get('port'), function() {
    debug('Taskful server listening on port ' + app.get('port'));
    log.info('Taskful server listening on port ' + app.get('port'));
});

global.socketIO = socketio;
socketjs.connect(server);
var libs = process.cwd() + '/libs/';
var log = require(libs + 'log')(module);

module.exports.connect = function(server) {
    var io = global.socketIO;

    io.on('connection', function (socket) {
    //This comes through
        log.info('Connection to socket.io');
    });
}
var io = global.socketIO;

...

router.get('/:id', function(req, res) {
    projectController.findByIdExtended(req, res, function(err, ret) {
        if (err) {
            res.redirect('/projects');
        }
        req.session.viewingProject = req.params.id;

        //I would like to be able to join the room here
        io.room = 'project_' + req.session.viewingProject;
        io.join(io.room);

        var db_project = ret[0];
        var db_tasks = ret[1];

        res.render('project', { user : req.user, project : db_project, tasks: db_tasks });
    });
});
sockets/socket.js

var express = require('express');
var app = express();
var http = require('http').Server(app);
var socketio = require('socket.io').listen(http);
var socketjs = require(libs + 'sockets/socket.js');

...

var server = http.listen(app.get('port'), function() {
    debug('Taskful server listening on port ' + app.get('port'));
    log.info('Taskful server listening on port ' + app.get('port'));
});

global.socketIO = socketio;
socketjs.connect(server);
var libs = process.cwd() + '/libs/';
var log = require(libs + 'log')(module);

module.exports.connect = function(server) {
    var io = global.socketIO;

    io.on('connection', function (socket) {
    //This comes through
        log.info('Connection to socket.io');
    });
}
var io = global.socketIO;

...

router.get('/:id', function(req, res) {
    projectController.findByIdExtended(req, res, function(err, ret) {
        if (err) {
            res.redirect('/projects');
        }
        req.session.viewingProject = req.params.id;

        //I would like to be able to join the room here
        io.room = 'project_' + req.session.viewingProject;
        io.join(io.room);

        var db_project = ret[0];
        var db_tasks = ret[1];

        res.render('project', { user : req.user, project : db_project, tasks: db_tasks });
    });
});
Route-projects.js

var express = require('express');
var app = express();
var http = require('http').Server(app);
var socketio = require('socket.io').listen(http);
var socketjs = require(libs + 'sockets/socket.js');

...

var server = http.listen(app.get('port'), function() {
    debug('Taskful server listening on port ' + app.get('port'));
    log.info('Taskful server listening on port ' + app.get('port'));
});

global.socketIO = socketio;
socketjs.connect(server);
var libs = process.cwd() + '/libs/';
var log = require(libs + 'log')(module);

module.exports.connect = function(server) {
    var io = global.socketIO;

    io.on('connection', function (socket) {
    //This comes through
        log.info('Connection to socket.io');
    });
}
var io = global.socketIO;

...

router.get('/:id', function(req, res) {
    projectController.findByIdExtended(req, res, function(err, ret) {
        if (err) {
            res.redirect('/projects');
        }
        req.session.viewingProject = req.params.id;

        //I would like to be able to join the room here
        io.room = 'project_' + req.session.viewingProject;
        io.join(io.room);

        var db_project = ret[0];
        var db_tasks = ret[1];

        res.render('project', { user : req.user, project : db_project, tasks: db_tasks });
    });
});
在评论中,我希望在访问路由时加入socket IO室

我试过
io.sockets.join
但它们都不是函数。从控制台日志中可以看出,全局IO作用域是完全正确的

使用EventEmitter并只接收事件以加入socket.js文件中的文件室是否更容易做到这一点?如果有,有什么办法吗

非常感谢您的帮助。

您可以在特定的socket.io套接字上调用
socket.join()
。您不能调用
io.join()
io.sockets.join()
。因此,您需要获取要放在房间中的特定
套接字
对象,然后调用:

socket.join('project_' + req.session.viewingProject);
在上面

如果您试图获取与发出当前路由请求的用户关联的特定
套接字
,则必须在套接字和路由之间建立关联(通常使用已知的cookie标识符)。您可以从路由中查找该cookie值,然后使用该值为当前用户找到正确的
socket
对象

您似乎已经在使用会话,因此应该已经有了一个cookie标识符,可以用来将路由与特定的socket.io连接相关联。您可能需要创建一个映射对象,将('connection')上的
io.on和('disconnect')上的
socket.on关联起来,这样您就可以获取会话ID并在该映射中查找正确的套接字对象


注意:您使用:

var io = global.socketIO;
在projects.js的开头,作为模块变量有点反模式。这将创建一个模块加载定时依赖项,其中必须在加载
projects.js
模块之前完成对
global.socketIO
的分配,否则代码将无法工作。由于模块计时(尤其是循环依赖)可能是一个复杂的问题,因此这不是创建或拥有的理想情况

代码中的一个细微变化,要么根本不使用globals(通过显式地将
socketIO
值传递给projects.js构造函数),要么只移动
var io=global.socketIO编码到每个需要它作为局部变量的路由中,将完全删除此加载时间依赖关系