繁体   English   中英

node.js中module.export()的问题

[英]Problems with module.export() in nodejs

我正在使用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)将执行io.sockets.on('connection', function (socket)部分中的代码。

我对node.js world和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);
    });
});

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM