通过Node.js路由http请求

我试图做一个黄瓜testing设置与Node.js可以testing任何网站通过使用iframe。 通常iframe是一个不行,因为跨脚本的安全限制。 但是,如果可能的话(我确定是这样的,而且我相信你会想出一个解决scheme),当请求一个特定的url名称时,通过请求的url获取testing的目标网站,这样iframe将被加载一个testing目标的副本。 基本上只是一个标准的node.js服务器,根据req.url获取特定的页面,类似于一个地址请求路由器。

这是我公然的尝试做到这一点。 通过获取testing页面。 该url的作品。 但我有问题从http服务器切换到连接对象。 有没有办法“喂”与http服务器响应的连接?

PS。 我还创build了两个node.js服务器的解决scheme。 节点1获取testing目标并将其与黄瓜testing页面混合。 节点2主持黄瓜testing。 此解决scheme正在工作。 但是它会在发生JavaScript命名冲突的网站上产生问题。 这就是为什么通过封装解决这个问题的iframe解决scheme更具吸引力。

var http = require('http'); var connect = require('connect'); var port = process.env.PORT || 8788; var server = http.createServer(function(req, webres) { var url = req.url; console.log(url); if(url == '/myWebsiteToBeTestedWithCucumberJS') { // Load the web site to be tested "myWebsiteToBeTestedWithCucumberJS" // And update the references // Finaly write the page with the webres // The page will appear to be hosted locally console.log('Loading myWebsiteToBeTestedWithCucumberJS'); webres.writeHead(200, {'content-type': 'text/html, level=1'}); var options = { host: 'www.myWebsiteToBeTestedWithCucumberJS.com, port: 80, path: '/' }; var page = ''; var req = http.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on('data', function(chunk) { page = page + chunk; }); res.on('end', function() { // Change relative paths to absolute (actual web location where images, javascript and stylesheets is placed) page = page.replace(/ href="\/\//g , ' href="/'); page = page.replace(/ src="\//g , ' src="www.myWebsiteToBeTestedWithCucumberJS.com'); page = page.replace(/ data-src="\//g , ' data-src="www.myWebsiteToBeTestedWithCucumberJS.com'); page = page.replace(/ href="\//g , ' href="www.myWebsiteToBeTestedWithCucumberJS.com'); webres.write(page); webres.end(''); }); }); } else { // Load any file from localhost:8788 // This is where the cucumber.js project files are hosted var dirserver = connect.createServer(); var browserify = require('browserify'); var cukeBundle = browserify({ mount: '/cucumber.js', require: ['cucumber-html', './lib/cucumber', 'gherkin/lib/gherkin/lexer/en'], ignore: ['./cucumber/cli', 'connect'] }); dirserver.use(connect.static(__dirname)); dirserver.use(cukeBundle); dirserver.listen(port); } }).on('error', function(e) { console.log("Got error: " + e.message); }); server.listen(port); console.log('Accepting connections on port ' + port + '...'); 

那毕竟不是那么难。
作为node.js的新手,我必须意识到使用多个监听器的可能性。
阅读nodejitsu的function帮助我解决了这个问题。

以下示例在指定url时加载www.myWebsiteToBeTestedWithCucumberJS.com,如下所示: http://localhost:9788/myWebsiteToBeTestedWithCucumberJS其中所有其他请求都按照cucumber.js网站请求处理。
希望这对其他node.js newcucumbers有意义。

 var http = require('http'); var connect = require('connect'); var port = process.env.PORT || 9788; var server = http.createServer(function(req, webres) { var url = req.url; console.log(url); if(url == '/myWebsiteToBeTestedWithCucumberJS') { loadMyWebsiteToBeTestedWithCucumberJS(req, webres); } else { loadLocal(req, webres, url); } }).on('error', function(e) { console.log("Got error: " + e.message); }); server.listen(port); console.log('Accepting connections on port ' + port + '...'); function loadMyWebsiteToBeTestedWithCucumberJS(req, webres) { console.log('Loading myWebsiteToBeTestedWithCucumberJS'); webres.writeHead(200, {'content-type': 'text/html, level=1'}); var options = { host: 'www.myWebsiteToBeTestedWithCucumberJS.com', port: 80, path: '/' }; var page = ''; var req = http.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on('data', function(chunk) { page = page + chunk; }); res.on('end', function() { page = page.replace(/ href="\/\//g , ' href="/'); page = page.replace(/ src="\//g , ' src="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); page = page.replace(/ data-src="\//g , ' data-src="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); page = page.replace(/ href="\//g , ' href="http://www.myWebsiteToBeTestedWithCucumberJS.com/'); webres.write(page); webres.end(''); }); }); } function loadLocal(req, webres, path) { console.log('Loading localhost'); webres.writeHead(200, {'content-type': 'text/html, level=1'}); var options = { host: 'localhost', port: 9787, path: path }; var page = ''; var req = http.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on('data', function(chunk) { page = page + chunk; }); res.on('end', function() { webres.write(page); webres.end(''); }); }); } // Cucumber site listening on port 9787 var dirserver = connect.createServer(); var browserify = require('browserify'); var cukeBundle = browserify( { mount: '/cucumber.js', require: ['cucumber-html', './lib/cucumber', 'gherkin/lib/gherkin/lexer/en'], ignore: ['./cucumber/cli', 'connect'] }); dirserver.use(connect.static(__dirname)); dirserver.use(cukeBundle); dirserver.listen(9787);