javascript - 通过 Node.js 路由 http 请求

标签 javascript node.js networking cucumber

我正在尝试使用 Node.js 制作一个 Cucumber 测试设置,它可以使用 iframe 测试任何网站。 通常情况下,由于跨脚本安全限制,iframe 是不行的。 但是,如果可能的话(我确定是的。我相信你会想出一个解决方案) 当请求特定的 url 名称时,通过请求的 url 获取作为测试目标的网站,以便 iframe 加载测试目标的副本。 基本上只是一个标准的 node.js 服务器,它根据 req.url 获取特定页面 类似于地址请求路由器。

这是我公然尝试做到这一点。 通过获取测试页。该网址有效。 但是我在从 http 服务器切换到连接对象时遇到了问题。 有没有办法用 http 服务器响应“提供”连接?

附言。我还创建了一个包含两个 node.js 服务器的解决方案。 Node 1 获取测试目标并将其与 cucumber 测试页面混合。 托管 cucumber 测试的 Node 2。 该解决方案正在运行。但它会在发生 javascript 命名冲突的网站上产生问题。这就是为什么通过封装解决此问题的 iframe 解决方案更具吸引力。

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的功能帮助我解决了问题。

下面的示例加载 www.myWebsiteToBeTestedWithCucumberJS.com 当指定 url 如下时: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);

关于javascript - 通过 Node.js 路由 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11756459/

相关文章:

node.js - 压缩 AWS Lambda 响应以避免 6MB 限制有什么好处?

node.js - 使用 Firebase 身份验证验证 ID token

ios - 如何更好地优化 iOS 上的网络?

node.js - 将 JSON var 从路由传递到 ejs

android - 确定套接字何时在 Android 上关闭

java - RabbitMQ 发送对象

javascript - 用纯 JS 切换 div

javascript - jQuery 代码将所有内容隐藏在我的 div 中

javascript - 检测交叉点 Turf.js,第一个和最后一个位置不相等

javascript - CSS翻转动画?