首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs中的module.export()问题

问nodejs中的module.export()问题
EN

Stack Overflow用户
提问于 2014-02-27 15:27:13
回答 1查看 211关注 0票数 1

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

下面是问题代码(chat.js)

代码语言:javascript
复制
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函数。我很确定我不明白什么但我不知道是什么。

我的实际项目树如下:

代码语言:javascript
复制
project
├── app.js
├── models
├── routes
    ├── chat.js
├── public
├── views

如果你有什么想法的话,那就太好了,谢谢。

编辑:如果问题不能理解,是一个例子:

首先,用户访问项目/的主页,所有工作正常,控制台中没有什么特殊的内容。

然后他转到聊天页面/chat/room1,在控制台中我们可以看到

代码语言:javascript
复制
Join room chatroom:room1
   debug - websocket writing 5:::{"name":"message","args":[{"message":"A user just join the session chatroom:room1"}]}

这里一切都很好。

但是,当他再次访问主页时,前面的消息再次出现在控制台中:

代码语言:javascript
复制
Join room chatroom:room1
   debug - websocket writing 5:::{"name":"message","args":[{"message":"A user just join the session chatroom:room1"}]}

这就是我不明白的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 16:15:25

当用户转到主页(/)时,显然页面上有socket.io脚本。但是,由于socket.io尚未侦听服务器上的连接,所以无法连接。

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

代码语言:javascript
复制
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;只需确保客户端页不尝试进行套接字连接,除非用户位于所需的页面上。

移动这段代码..。

代码语言:javascript
复制
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);
    });
});

任何请求处理程序的...outside,并让它在服务器启动时正确运行。这些代码所做的就是定义一个事件处理程序,只要一个新的套接字连接到服务器,它就会运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22072941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档