如何代理 websocket 连接
How to proxy a websocket connection
我用 github.com/facebook/create-react-app 解决了这个问题:
https://github.com/facebook/create-react-app/issues/8527
基本上我是用我自己的服务器代理 webpack-dev-server。 HTTP 请求没问题,但 Websocket 请求将失败并出现此错误:
WebSocket connection to 'ws://localhost:3016/sockjs-node' failed
因为有一个 Websocket 服务器侦听 3015 而不是 3016。
所以我可能希望代理一个 websocket 请求。我可以像这样代理 HTTP 请求:
app.use((req,res,next) => {
// proxy to dev server
console.log('path:', req.path);
console.log('url:', req.url);
const r = http.request({
method: req.method,
path: req.path,
host: 'localhost',
protocol: 'http:',
port: 3015 // webpack-dev-server is listening on 3015
}, r => {
r.pipe(res);
});
r.once('error', next);
req.pipe(r);
});
app.listen(3016); // app listens on 3016 and forwards some requests to webpack-dev-server listening on 3015
有人知道代理 websocket 请求的好方法吗?
这是我代理 ws 连接的尝试:https://github.com/websockets/ws/issues/1697
您可以使用一个非常稳定且经过验证的库 http-proxy
,它被许多其他反向代理和负载平衡器等用作依赖项。它支持代理 websockets。它也非常易于使用。这是其 repository
中的最小示例
httpProxy.createServer({
target: 'ws://localhost:3016',
ws: true
}).listen(3001);
我用 github.com/facebook/create-react-app 解决了这个问题: https://github.com/facebook/create-react-app/issues/8527
基本上我是用我自己的服务器代理 webpack-dev-server。 HTTP 请求没问题,但 Websocket 请求将失败并出现此错误:
WebSocket connection to 'ws://localhost:3016/sockjs-node' failed
因为有一个 Websocket 服务器侦听 3015 而不是 3016。
所以我可能希望代理一个 websocket 请求。我可以像这样代理 HTTP 请求:
app.use((req,res,next) => {
// proxy to dev server
console.log('path:', req.path);
console.log('url:', req.url);
const r = http.request({
method: req.method,
path: req.path,
host: 'localhost',
protocol: 'http:',
port: 3015 // webpack-dev-server is listening on 3015
}, r => {
r.pipe(res);
});
r.once('error', next);
req.pipe(r);
});
app.listen(3016); // app listens on 3016 and forwards some requests to webpack-dev-server listening on 3015
有人知道代理 websocket 请求的好方法吗?
这是我代理 ws 连接的尝试:https://github.com/websockets/ws/issues/1697
您可以使用一个非常稳定且经过验证的库 http-proxy
,它被许多其他反向代理和负载平衡器等用作依赖项。它支持代理 websockets。它也非常易于使用。这是其 repository
httpProxy.createServer({
target: 'ws://localhost:3016',
ws: true
}).listen(3001);