我正在使用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 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"}]}
这是我不明白的。
答案 0 :(得分:0)
当用户转到主页(/
)时,您显然在页面上有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);
});
});
...在任何请求处理程序之外,让它在服务器启动时运行。所有这些代码都定义了一个事件处理程序,它将在新套接字连接到服务器的任何时候运行。