使用Express.js + Request.js的代理

时间:2014-01-23 10:30:51

标签: javascript node.js express request

我开始用Express.js和Request.js编写代理服务器

服务器在端口900上运行并执行:

  1. 从路径/prototype
  2. 提供静态内容
  3. 对于某些电话 将请求转发到另一台服务器(在端口8080上)
  4. 解析 /prototype/[this|that]到相应的静态html /prototype/this.html/prototype/that.html
  5. 同时将this.html作为/ prototype
  6. 的默认值

    我设法用以下代码实现1) - 3):

    var express = require('express'), path = require('path'), request = require('request');
    
    var app = express();
    
    app.get('/prototype', function(req, res, next) {
      // a) request(req.protocol + '://' + req.get('host') + req.url +  '/this').pipe(res);
      // b) res.redirect('/prototype/this');
    });
    
    app.get('/prototype/:path(this|that)', function(req, res, next) {
      var resolvedUrl = req.protocol + '://' + req.get('host') + req._parsedUrl.pathname + '.html';
      request(resolvedUrl).pipe(res);
    });
    
    app.get('/prototype/sample/:path', function(req, res, next) {
      var resolvedUrl = 'http://localhost:8080' + req.url;
      request(resolvedUrl).pipe(res);
    });
    
    app
      .use('/prototype', express.static(path.resolve(__dirname, '../')))
      .use(app.router)
      .use(express.errorHandler({
        dumpException: true,
        showStack: true
      }));
    
    module.exports = app;
    

    我的文件夹结构是

    prototype
    |_css
    | |_<css files>
    |_js
    | |_<js files>
    |_this.html
    |_that.html
    

    this.html引用css和js中的文件

    <link rel="stylesheet" href="css/app.css" />
    <script data-main="js/app.js" src="js/require.js"></script>
    

    为了实现4)我在请求/prototype/this时尝试请求/prototype路径,然后从/js/app.js/css/app.css请求js和css失败的/prototype/js/app.js/prototype/css/app.css (请参阅代码注释中的a))。 我希望通过b)实现我想要实现的行为,但我不希望将浏览器中的URL栏更改为/ prototype / this,而是将其保留在/protoype中。

    有什么好办法吗?

1 个答案:

答案 0 :(得分:0)

/prototype之后被证明是一个缺失的尾随斜线。 如果没有尾部斜杠,我会在请求目录路径而不尾随斜杠的情况下覆盖重定向到带斜杠的目录的行为。

将其更改为以下内容,它就像魅力一样。

app.get('/prototype/', function(req, res, next) {
  // a) request(req.protocol + '://' + req.get('host') + req.url +  '/this').pipe(res);
  // b) res.redirect('/prototype/this');
});