我在 express.js 中使用 socket.io,在 angular 4 中使用 socket.io-client,并带有以下 Caddyfile(它的一部分):
proxy /api web-api:8080 {
transparent
}
proxy /socket.io web-api:8080 {
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
websocket
}
使用以下命令通过 Dockerfile 执行 Caddy 服务器:
CMD ["caddy", "-http2=false"]
在角度部分,我使用以下代码(部分代码):
let observable = new Observable(observer => {
this.socket = io.connect(`${environment.apiUrl}`);
this.socket.on('message', (message: any) => {
observer.next(message);
});
return () => {
this.socket.disconnect();
};
});
return observable;
在 express.js 上如下:
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
在开发模式下(既没有使用 docker 也没有使用 caddy)一切都按预期工作,但在生产模式下,我不断在浏览器的控制台中以这种形式收到 POST 和 GET 响应/请求(没有任何错误):
...
http://my-app-example/socket.io/?EIO=3&transport=polling&t=MFB2-Bv
http://my-app-example/socket.io/?EIO=3&transport=polling&t=MFB31eM
http://my-app-example/socket.io/?EIO=3&transport=polling&t=MFB2_oS
...
似乎“发射”事件永远不会被解雇。也许它与 Docker 容器内的套接字通信有关。