node.js node-http-proxy:如何在proxy.web中的目标时避免使用WebSocket的异常

时间:2018-02-07 02:00:44

标签: node.js proxy node-http-proxy

在node.js中使用http-proxy(又名node-http-proxy),在动态确定目标时(即处理请求时),我无法弄清楚如何代理Web套接字。

查看文档: https://github.com/nodejitsu/node-http-proxy

有一个示例显示在处理请求时能够设置目标:

var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http.createServer(function(req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  proxy.web(req, res, { target: 'http://127.0.0.1:5060' });
});

console.log("listening on port 5050")
server.listen(5050);

还有另一个示例,通过proxy.ws()显示对websockets的支持,但它显示目标是静态设置而不是取决于请求:

//
// Setup our server to proxy standard HTTP requests
//
var proxy = new httpProxy.createProxyServer({
  target: {
    host: 'localhost',
    port: 9015
  }
});
var proxyServer = http.createServer(function (req, res) {
  proxy.web(req, res);
});

//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
proxyServer.on('upgrade', function (req, socket, head) {
  proxy.ws(req, socket, head);
});

proxyServer.listen(8015);

我拿了第一个例子,并在第二个例子中添加了proxyServer.on('upgrade'... proxy.ws()... stuff,以获得在处理请求时设置目标的示例支持websockets.HTTP网页似乎工作正常,但在处理websocket请求时抛出异常。

'use strict';
var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http.createServer(function(req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  proxy.web(req, res, { target: 'http://127.0.0.1:5060' });
});

//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
server.on('upgrade', function (req, socket, head) {
  proxy.ws(req, socket, head);
});

console.log("listening on port 5050")
server.listen(5050);

在proxy.ws(req,socket,head)调用中发生异常:

Error: Must provide a proper URL as target
    at ProxyServer.<anonymous> (...../node_modules/http-proxy/lib/http-proxy/index.js:68:35)
    at Server.<anonymous> (...../poc.js:26:9)  // the location in my sample code of the proxy.ws(req, socket, head) above
    at emitThree (events.js:116:13)
    at Server.emit (events.js:194:7)
    at onParserExecuteCommon (_http_server.js:409:14)
    at HTTPParser.onParserExecute (_http_server.js:377:5)

如果选项中没有.target或.forward成员,http-proxy / index.js:68:35中的代码会抛出此异常。

如何在每个请求的基础上设置目标并使websockets工作?

1 个答案:

答案 0 :(得分:0)

我有一个答案。在看了康拉德的这个问题和评论之后,然后进行了试验: single-proxyserver-to-multiple-targets

proxy.ws可以采用额外的选项参数,就像proxy.web。

一样

这是工作代码。

'use strict';
var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with custom application logic
//
var proxy = httpProxy.createProxyServer({});

//
// Create your custom server and just call `proxy.web()` to proxy
// a web request to the target passed in the options
// also you can use `proxy.ws()` to proxy a websockets request
//
var server = http.createServer(function(req, res) {
  // You can define here your custom logic to handle the request
  // and then proxy the request.
  proxy.web(req, res, { target: 'http://127.0.0.1:5060' });
});

//
// Listen to the `upgrade` event and proxy the
// WebSocket requests as well.
//
server.on('upgrade', function (req, socket, head) {
  proxy.ws(req, socket, head, { target: 'ws://127.0.0.1:5060' });
});

console.log("listening on port 5050")
server.listen(5050);