我在节点应用程序中使用socket.io。我也有一个离子应用程序作为客户端。当我的计算机在localhost下提供服务时,它们都在工作。但是今天,节点应用程序已通过apache上传到测试服务器。 Apache已配置为https://SERVER_IP/attendance下的nodejs服务器的反向代理,并且客户端连接到socket.io服务器,但是没有发出的事件进入客户端。
我将发布客户端,服务器和apache配置的相关代码:
离子客户端代码
this.socket = io(this.socketUrl, {
query: {
sessionId: sessionId
}
});
this.socket.on('connect', (data) => {
console.log('connected', data);
});
this.socket.on('code received', (code) => {
console.log('code received');
this.code = code;
});
nodejs服务器代码
io.on('connection', function (socket) {
const querySessionId = socket.handshake.query.sessionId;
connectedClients[querySessionId] = socket;
socket.broadcast.emit('connect', 'connected');
socket.on('disconnect', function () {
delete connectedClients[querySessionId];
});
});
connectedClients[sessionId].emit('code received', newCode);
我使用connectedClients
保留客户列表,并将消息发送给适当的客户,而不是每个人。
Apache配置
<VirtualHost *:80>
...
ProxyPreserveHost On
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:3000/$1 [P,L]
ProxyPass /socket.io http://localhost:3000/socket.io
ProxyPassReverse /socket.io http://localhost:3000/socket.io
ProxyPass /attendance http://localhost:3000
ProxyPassReverse /attendance http://localhost:3000
</VirtualHost>
nodejs应用程序正在服务器的端口3000上运行。奇怪的是,如果我尝试通过端口而不是通过/ attendance路径进行连接,则它可以正常工作,并且客户端接收到发出的事件。