Articles of node http proxy

Node.js:使用快速路由进行url重写以代理etherpad

我的第一个问题在stackoverflow;)。 我想做的事情是:我想使用快速path“/ pad / *”来显示etherpad(etherpad lite),并操作用户将看到的内容。 所以,如果我得到“/ pad / p / something”,那么“something”将被处理,并相应地改变为真实ID,例如“XYZ”。 所以用户可以编辑正确的键盘。 然而,etherpad需要大量的静态东西和websocket,因此我想代理它,并操纵身份证,如果我需要 最小的工作示例:当然,ID变化的真正逻辑要复杂得多,但对于最小工作示例,我只是使用每个padID映射到“a”的逻辑。 我想出了这个: /* packages */ var express = require( "express" ); var http = require( "http" ); var httpProxy = require('http-proxy'); /* app */ var app = express(); app.use(app.router); /* some express logic */ app.get( '/' , function( req , res […]

我不能使用SNICallback

我无法pipe理使用createServer函数上的SNICallback。 当我尝试下面的代码时,我得到一个错误,因为Missing PFX or certificate + pricate key. 我该如何解决这个问题? var fs = require('fs'), tls = require('tls'), https = require('https'); var certs = { "safe.myDomain.com": { key: fs.readFileSync('../SSL/safe/private/key.pem'), cert: fs.readFileSync('../SSL/safe/certs/cert.pem') }, "api.myDomain.com": { key: fs.readFileSync('../SSL/api/private/key.pem'), cert: fs.readFileSync('../SSL/api/certs/cert.pem') } } var httpsOptions = { SNICallback: function(hostname, cb) { var ctx = tls.createSecureContext(certs[hostname]) cb(null, ctx]) } } https.createServer(httpsOptions).listen(1443, […]

在expressjs中使用node-http-proxy时出错

我没有得到node-http-proxy的最后一个版本(虽然这个版本在之前的版本中有效)。 Node.js版本是0.6.12,node-http-proxy版本是0.8.0。 基本上,我有一个服务器监听端口10000和另一个监听端口5000.我想代理这个最后一个家伙所有的请求/ / API(删除这个前缀后)。 我的代码是: var express = require("express"); var httpProxy = require('http-proxy'); var cluster = require('cluster'); var fs = require('fs'); // Use http server for local tests var app = express.createServer(); // Proxy request targeting API app.all('/api/*',function(req, res){ // Remove '/api' part from query string req.url = '/' + req.url.split('/').slice(2).join('/'); // Create proxy […]

使用节点代理时出错

我使用下面的程序,当我运行它我有以下错误我能够运行应用程序,但是当我把浏览器localhost:3000我在控制台中得到这个错误… **Error: connect ECONNREFUSED** at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1000:19) 这是我的程序非常简单的节点applicaton只有一个文件,下面的代码(这是我的服务器/应用程序/ .js var http = require('http'), httpProxy = require('http-proxy'), url = require('url'); proxy = httpProxy.createProxyServer({}); http.createServer(function (req, res) { switch (hostname) { case 'localhost': proxy.web(req, res, {target: 'http://localhost:9001'}); break; } }).listen(3005, function () { console.log('original proxy listening on port: ' + 3005); }); […]

在Node群集上运行多个Node应用程序

我们需要在一组服务器(负载均衡器后面)上部署多个Node / Express应用程序。 这些应用程序在function上完全相互独立。 我将首先解释我是如何考虑这样做的,然后根据最佳实践寻找意见,如果我的devise中有任何红旗。 这是我正在考虑的设置: 负载平衡器后面的前端服务器将运行node-http-proxy,它将接受端口80上的传入请求。此反向代理将将请求路由到在此服务器上的不同端口上运行的相应节点应用程序。 例如: var http = require('http'), httpProxy = require('http-proxy'); var options = { router: { 'myapphost.com/MyFirstApp': 'myapphost.com:3000', 'myapphost.com/MySecondApp': 'myapphost.com:3001' } } // …and then pass them in when you create your proxy. var proxyServer = httpProxy.createServer(options).listen(80); 每个节点应用程序将使用类似于Cluster2的节点群集运行,以利用多核系统。 我的问题: 这是正确的devise和策略? 我们的一些应用程序需要有状态。 在这种设置中进行国家pipe理的最佳方式是什么? 使用Redis等外部会话存储是正确的方法? 或者将会话固定到给定的前端机器并使用内存中的会话存储? 更新: 既然我发表了这个问题,在和几个人交谈之后,还有一个方法来了 – 我可以使用Nginx作为我的前端机器前面的反向代理和负载均衡器。 每个前端机器将只提供一个应用程序。 该应用程序可以有一个备份机器。 […]

尝试运行一个例子吞噬的问题 – “inheritance`的超级构造函数不能为空或未定义。

我正在尝试运行一个示例 ,但是当我尝试吞咽时出现以下错误。 我对节点很新,所以任何方向或帮助将非常感激。 安装似乎没有任何问题。 $ nvm exec 4.2.2 gulp Running node v4.2.2 (npm v2.14.7) util.js:756 throw new TypeError('The super constructor to `inherits` must not ' + ^ TypeError: The super constructor to `inherits` must not be null or undefined. at Object.exports.inherits (util.js:756:11) at Object.<anonymous> ([working directory path]/node_modules/browser-sync/node_modules/http-proxy/lib/http-proxy/index.js:108:17) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load […]

使用Express代理,如何更改相对的url?

为了避免使用客户端JavaScript代码的典型CORS问题,我使用了一个nodejs express服务器。 该服务器包含以下代码: var app = express(); app.all('/Api/*', function (req, res) { proxy.web(req, res, { target: 'https://www.myserver.com', changeOrigin:true }); }); 那么这个做的是将任何以/Api开头的调用redirect到我的服务器。 但是,这也将Api附加到URLpath,所以Api/getData变成https://www.myserver.com/Api/getData 有没有办法Api相对url的Api部分? 最终结果将是Api/getData成为https://www.myserver.com/getData 这将允许我通过更改相对urlpath的第一部分来定位多个服务器。 像这样的东西: Api/getData – > https://www.myserver.com/getData OtherApi/getData/for/some/path – > https://www.some-other-server.com/getData/for/some/path 这当然适用于所有请求types,不仅适用于GET 谢谢!

检查在新端口上运行的应用程序

我需要创build应用程序获取特定端口的请求,并将其代理到不同端口上的新服务器 例如下面的端口3000将代理端口9000,你实际上运行在9000(应用程序引擎)的应用程序,因为客户端中的用户点击3000 HTTP://本地主机:3000 / A / B / C HTTP://本地主机:9000 / A / B / C 我尝试类似 var proxy = httpProxy.createProxyServer({}); http.createServer(function (req, res) { var hostname = req.headers.host.split(":")[0]; var pathname = url.parse(req.url).pathname; proxy.web(req, res, { target: 'http://' + hostname + ':' + 9000 }); var proxyServer = http.createServer(function (req, res) { res.end("Request received on […]

我如何超速缓慢连接中间件,而是返回节点响应?

我有一个使用Connect的节点服务器来插入一些中间件,这些中间件试图转换node-http-proxy的响应stream。 偶尔,这种转换可能会非常缓慢,在这种情况下,最好只返回一个不包含转换的响应,或者包含部分应用程序。 在我的应用程序中,我试图在转换中间件的上下文中使用setTimeout来调用next毫秒。 这通常工作,但暴露的竞争条件,如果中间件已经调用next ,然后setTimeout触发,并发生相同的错误,如下所示: Error: Can't set headers after they are sent. 最终,我发展了setTimeout ,以Error实例作为第一个参数,然后在我的中间件链中捕获该错误,并假设res.headersSent为false ,然后开始通过res.end.call(res)发送响应。 这工作,令人惊讶的是我可以设置超时几乎没有和响应会发生快得多,是完整的。 我觉得这最后一个方法是一个黑客,并不能免受相同的竞争条件,但也许似乎是更有弹性一点。 所以我想知道Node和Connect处理这种事情有什么样的惯用方法。 我该如何解决慢中间件的超时问题,并简单地返回响应stream? 目前这似乎是做我想要的,或多或less,但再次感到有点毛病。 let resTimedout = false; const timeout = setTimeout(() => { if (!resTimedout) { resTimedout = true; next(); } }, 100); getSelectors(headers, uri, (selectors) => { const resSelectors = Object.keys(selectors).map((selector) => { … }; const […]

使用http-proxy和body-parser与express时,节点挂起POST请求

我也已经把这个发布到http-proxy的相关问题上 。 我正在使用http-proxy与express所以我可以截取我的客户端和api之间的请求,以添加一些cookie进行身份validation。 为了validation客户端必须发送带有x-www-form-urlencoded作为内容types的POST请求。 所以我使用body-parser中间件来parsing请求体,这样我就可以在请求中插入数据了。 http-proxy在使用body-parser遇到了一个问题,因为它将bodyparsing为一个stream,并且从不closures它,所以proxy永远不会完成请求。 在http-proxy的例子中有一个解决scheme,在我尝试使用的parsing之后,“重新stream”请求。 我也试图在同样的问题中使用connect-restreamer解决scheme,但没有运气。 我的代码看起来像这样 var express = require('express'), bodyParser = require('body-parser'), httpProxy = require('http-proxy'); var proxy = httpProxy.createProxyServer({changeOrigin: true}); var restreamer = function (){ return function (req, res, next) { //restreame req.removeAllListeners('data') req.removeAllListeners('end') next() process.nextTick(function () { if(req.body) { req.emit('data', req.body) //error gets thrown here } req.emit('end') }) } } […]