如何代理 websocket 连接

3 proxy websocket node.js webpack webpack-dev-server

我有这个问题,我用 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
Run Code Online (Sandbox Code Playgroud)

因为有一个 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
Run Code Online (Sandbox Code Playgroud)

有人知道代理 websocket 请求的好方法吗?

这是我尝试代理 ws 连接:https : //github.com/websockets/ws/issues/1697

C.G*_*hev 6

您可以使用一个非常稳定且经过验证的库http-proxy,它被许多其他反向代理和负载平衡器等用作依赖项。它支持代理 websockets。它也很容易使用。这是其存储库中的最小示例

httpProxy.createServer({
  target: 'ws://localhost:3016',
  ws: true
}).listen(3001);
Run Code Online (Sandbox Code Playgroud)