简体   繁体   中英

How to facade (proxy) websocket port

I have server side rendering react app in which i have proxied all http calls to different port. Please see the code below for http proxy.

import proxy from "express-http-proxy";
const app = express();
const bodyParser = require("body-parser");
const http = require('http');
const  httpProxy = require('http-proxy');
const PORT = process.env.PORT || 3001;
httpProxy.createServer({
    target: 'ws://localhost:4000',
    ws: true
}).listen(PORT); //Throws error since 3000 port is already used by //app.listen.
app.use(
  "/api",
  proxy("http://localhost:4000/", {

    proxyReqOptDecorator(opts) {
      opts.headers["x-forwarded-host"] = "http://localhost:4000/";
      return opts;
    }
  })
);
app.post("/logger", (req, res) => {
  logger.debug(req.body.data);
  res.send({ status: "SUCCESS" });
});

app.listen(PORT, () => {
  logger.debug(`Portal listening on ${PORT}`);
});

that means when i make any calls /api/endpoint it will redirect to localhost:4000/endpoint but will be seen in the network as http://localhost:3000/endpoint1

I want the same behaviour with websockets as well. I am using new WebSocket( ws://localhost:3000/endpoint1 ); It should redirect to ws://localhost:4000/endpoint1 . and should be shown in network tab as ws://localhost:3000/endpoint1

Resolved it by using another library http-proxy-middleware

import httpproxy from "http-proxy-middleware";
import proxy from "express-http-proxy";
const app = express();
const bodyParser = require("body-parser");
const PORT = process.env.PORT || 3001;
const wsProxy = httpproxy('/ws', {
    target: 'ws://localhost:4000',
    pathRewrite: {
      '^/ws' : '/',        // rewrite path.
      '^/removepath' : ''               // remove path.
     },
    changeOrigin: true, // for vhosted sites, changes host header to match to target's host
    ws: true, // enable websocket proxy
    logLevel: 'debug'
});

app.use(wsProxy);
app.use(
  "/api",
  proxy("http://localhost:4000/", {

    proxyReqOptDecorator(opts) {
      opts.headers["x-forwarded-host"] = "http://localhost:4000/";
      return opts;
    }
  })
);
app.post("/logger", (req, res) => {
  logger.debug(req.body.data);
  res.send({ status: "SUCCESS" });
});

app.listen(PORT, () => {
  logger.debug(`Portal listening on ${PORT}`);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM