开发者

nodejs proxy not responding

开发者 https://www.devze.com 2023-04-08 19:19 出处:网络
I have a node.js app that serve static files (html, js, css). Among the static files, some ajax request are done (with /TEST in the request). I need those request to be proxied to another server runni

I have a node.js app that serve static files (html, js, css). Among the static files, some ajax request are done (with /TEST in the request). I need those request to be proxied to another server running on localhost:213445. The static pages are correctly displayed but when it comes to proxied request it hangs forever...

My code is:

var express = require("express");
var httpProxy = require('http-proxy');
var fs = require('fs');

// Create https server
var app = express.createServer({
    key: fs.readFileSync('privatekey.pem'),
    cert: fs.readFileSync('certificate.pem')
});

// Handle static files
app.use(express.static(__dirname + '/public'));

// Proxy request
app.all('/TEST/*',function(req, res){
  // Remove '/TEST' part from query string
  req.url = '/' + req.url.split('/').slice(2).join('/');

  // Create proxy
  var proxy = new httpProxy.HttpProxy();
  proxy.proxyRequest(req, res, {
     host: 'localhost',
     port: 21345,
     enableXForwarded: false,
     buffer: proxy.bu开发者_运维技巧ffer(req)
  });
});

// Run application
app.listen(10443);


I have the same issue. If you comment out the

// Handle static files
app.use(express.static(__dirname + '/public'));

you will see that the the proxy works.

Not sure how to fix it if express.static is used

Marak Squires responded to the bug report!

This is an express problem. The Connect / Express middlewares are doing non-standard things to your response object, breaks streaming. Try using the raw request module instead of http-proxy. If you need proper middleware stack, check out https://github.com/flatiron/union


As described on the http-proxy issue 180 the trouble is related to the non-standard things done by connect mentioned above:

Use npm to install connect-restreamer and make this the final item in your app.configuration of express:

app.use(require('connect-restreamer')());

Then do something like:

var httpProxy = require('http-proxy');
var routingProxy = new httpProxy.RoutingProxy();

app.get('/proxy/', function (req, res) {
  routingProxy.proxyRequest(req, res, {
    target: {
       host : host,
       port : port
    }
  });
})

This will pass the whole URL, including "/proxy/" to the target host. You can rewrite/modify the headers of the req before they go into the proxyRequest() if you, e.g. want to mimic the request coming from a specific CNAME virtual host or different URL string.

0

精彩评论

暂无评论...
验证码 换一张
取 消