javascript - Nodejs 中 module.export() 的问题

标签 javascript node.js express socket.io

我正在使用express.js和socketio开发一个node.js项目。

这是有问题的代码 (chat.js)

function chat(req, res, io) {
    chatroom = 'chatroom:' + req.params.chatroom;

    io.sockets.on('connection', function (socket) {
        socket.join(chatroom);
        console.log('Join room '+chatroom);

        io.sockets.in(chatroom).emit('message', { message: 'A user just join the
             session '+chatroom });

        socket.on('disconnect',function(){
            console.log('User disconnected'); 
            socket.leave(chatroom);
        });

        socket.on('send', function (data) {
            io.sockets.in(chatroom).emit('message', data);
        });
    });

    res.render('chat.jade');
}

module.exports = function (app, io) {
    app.get('/chat/:chatroom', function(req, res){
        chat(req, res, io);
    });
};

我的问题是,当用户转到 chat.js 页面时,他之后访问的所有页面都会执行 io.sockets.on('connection', function (socket) 部分中的代码。

我对 node.js 世界和 socket.io 还很陌生,所以我不明白为什么这段代码仍然被执行,而 javascript 不应该首先进入 chat 函数。我很确定我不明白某些事情,但我不知道是什么。

我的实际项目树如下:

project
├── app.js
├── models
├── routes
    ├── chat.js
├── public
├── views

如果您有任何想法,那就太好了,谢谢。

编辑: 如果问题无法理解,请举一个例子:

首先,用户进入项目的主页/,一切正常,控制台没有什么特别的。

然后他就进入了聊天页面/chat/room1,在控制台我们可以看到

Join room chatroom:room1
   debug - websocket writing 5:::{"name":"message","args":[{"message":"A user just join the session chatroom:room1"}]}

这里一切正常。

但是当他再次进入主页时,之前的消息再次出现在控制台中:

Join room chatroom:room1
   debug - websocket writing 5:::{"name":"message","args":[{"message":"A user just join the session chatroom:room1"}]}

这就是我不明白的地方。

最佳答案

当用户进入主页 (/) 时,页面上显然有 socket.io 脚本。但是,连接失败,因为 socket.io 尚未监听服务器上的连接。

现在,当您的用户转到 /chat/room1 时,以下请求处理程序将处理页面请求:

app.get('/chat/:chatroom', function(req, res){
    chat(req, res, io);
    // When this is called, socket.io starts listening for connections, but not before.
});

由于请求处理程序已触发,socket.io 现在正在监听服务器上的连接。当用户再次访问 / 时,他们仍然会连接,因为现在您的服务器正在监听连接,并且您的 socket.io 客户端脚本出现在 / 页面上。

确保客户端代码仅连接到您想要的页面。此外,您不太可能希望在快速页面路由中定义 socket.io 连接事件处理程序。相反,您可能希望在服务器启动后立即启动 socket.io 监听连接;只需确保客户端页面不会尝试建立套接字连接,除非用户位于所需的页面上。

移动此代码...

io.sockets.on('connection', function (socket) {
    socket.join(chatroom);
    console.log('Join room '+chatroom);

    io.sockets.in(chatroom).emit('message', { message: 'A user just join the
         session '+chatroom });

    socket.on('disconnect',function(){
        console.log('User disconnected'); 
        socket.leave(chatroom);
    });

    socket.on('send', function (data) {
        io.sockets.in(chatroom).emit('message', data);
    });
});

...在任何请求处理程序之外,并让它在服务器启动时立即运行。所有这些代码所做的就是定义一个事件处理程序,该处理程序将在新套接字连接到服务器时运行。

关于javascript - Nodejs 中 module.export() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072941/

相关文章:

node.js - NPM安装显示错误

javascript - 使用 chrome.tabs 与 browser.tabs 来实现浏览器兼容性

javascript - 在 Vue.js 中绑定(bind)数组项

javascript - noflo:动态组件加载 - 组件 [名称] 不适用于基本 [路径]

node.js - react : Data won't be saved to this. 状态

javascript - 在node js中处理跨域ajax post

javascript - Socket.io Chat 应用程序显示检测到 EventEmitter 内存泄漏。添加了 11 个听众。使用 emitter.setMaxListeners()

mysql - 将数据从 React 发送到 MySQL

javascript - 我的 JS/jQuery 创建 div 有困难

javascript - 如何: Change color of button when an input is given to a textbox