【问题标题】:integration socket.io - express 4 ,same port and security session集成 socket.io - express 4,相同的端口和安全会话
【发布时间】:2014-06-10 17:12:41
【问题描述】:

我正在使用 mean.js,我需要在我的应用程序中添加一些实时功能,以实现这一点,我将使用 socket.io 库。 这是我关于如何在应用程序中集成并保持良好结构的想法。

意思是使用一个 server.js 文件,这是一个做很多配置的文件,所以我想做以下事情:

// Expose app
exports = module.exports = app;

// Add my reference to the socketServer
var io = require('/socketServer')(app);

文件“/socketServer.js”将是我的起点和我的套接字的配置点,看起来像这样:

var http = require('http');
var socketio = require('socket.io');

module.exports = function(express){
    var server = http.Server(express);
    var io = socketio(server);
    io.path('/');
    io.on('connect', function(socket){
        socket.emit('connected', {msg: 'You are connected now.'});
        socket.on('upvote', function(data){

            socket.emit('upvoteR', 'newConnected');
            socket.broadcast.emit('upvoteR', 'newCOnnected');
        });
    });
    server.listen(8080);
    return io;
};

我觉得将服务器默认配置与我的套接字配置分开,并使用它文件 (socketServer.js) 作为我的起点来开发注入我想要的依赖项的所有套接字逻辑可能对我有用。 我不知道是否有更好的方法来解决这个问题,或者我应该遵循的一些结构最佳实践或这样做的不便。

所以除了这个结构之外,还有其他疑问:

  • 如何在同一个端口使用sockets和express server? 似乎,使用 express 4 我无法将 express 服务器与套接字链接,因为 express 4 服务器不再继承 node.js 的 httpServer,所以现在我必须做一个 server.listen(socketPort) 如果我使用与 mean.js 相同的 app.port,这只是一个 EADDRINUSE 错误。仍然可以让它在同一个端口工作吗?
  • 如何使用快速会话来验证每个套接字连接?如果不可能,有什么更好的方法?一个示例或文档参考对我来说会很好。

提前致谢。

【问题讨论】:

  • socket.io 1.0 与 Express 4 配合得很好:socket.io/docs/#using-with-express-3/4
  • ops.. 是的,对不起,我没有意识到我忘记评论平均服务器( server.js )的 app.listen(config.port) 这就是为什么我收到 EDDRAUNISE 错误,对此感到抱歉.谢谢,我仍然想知道我是否可以使用快递会话并让安全快递。非常感谢..
  • 没关系 :D 老实说,我对 socket.io+Express 共享会话没有任何经验,但我认为 this code snippet 会对你有所帮助。但它可能有点过时(与 socket.io 1.0 和 Express 4 不兼容)。
  • 同意,似乎已经过时(3 年了吧?),但是是的,这可能对我有用,我要看看这段代码,也许我能找到学习我想要的最后一个版本的方法,非常感谢。
  • 你看过express.io吗?

标签: node.js socket.io mean-stack


【解决方案1】:

我想分享我的解决方案,以防将来有人和我有同样的要求。

如何根据快速会话信息验证每个套接字连接。

首先我通过以下方式配置 express 以使用 passport.js 库:

// CookieParser should be above session
    var cp =cookieParser;
    app.use(cp());

    // Express MongoDB session storage
    var mStore = new mongoStore({
            db: db.connection.db,
            collection: config.sessionCollection
        });

    app.use(session({
        secret: config.sessionSecret,
        store: mStore
    }));

    // use passport session
    app.use(passport.initialize());
    app.use(passport.session());

到此为止就是passport over express的正常实施了。除了这个配置,我在我的项目中添加了passport-socket.io.js。这是我的工作配置:

var server = http.Server(app);
    var io = IO(server);

    io.use(
        function(socket,next){
            passportSocketIo.authorize({
                cookieParser: cp,
                key:         'connect.sid',             // the name of the express cookie 
                secret:      config.sessionSecret,      // the session_secret to parse the cookie
                store:       mStore,                    // mongo session storage
                success:     onAuthorizeSuccess,        // *optional* callback on success
                fail:        onAuthorizeFail,           // *optional* callback on fail/error
            })(socket, next);
        }
    );
    app.io=io;
    server.listen(config.port);

其中“onAuthorizeSuccess”和“onAuthorizeFail”是允许连接和开发套接字逻辑的函数。好吧,我的socket.io连接通过我的护照会话信息进行身份验证,如果用户没有登录,套接字将连接不上。。

如果我们需要一些基于用户角色的授权逻辑,passport.socketio 会创建一个socket.request.user,您可以在其中找到您的用户角色以在您的角色套接字逻辑中使用..

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2014-06-23
    • 1970-01-01
    • 2016-08-27
    • 2018-04-27
    • 2015-02-28
    • 1970-01-01
    • 2014-10-21
    • 2012-08-24
    相关资源
    最近更新 更多