【问题标题】:Node.js: using express route for url rewrite to proxy to etherpadNode.js:使用快速路由进行 url 重写以代理到 etherpad
【发布时间】:2014-10-14 10:47:44
【问题描述】:

我关于 stackoverflow 的第一个问题 ;)。


我尝试做的事情: 我想使用快速路由“/pad/*”来显示 etherpad(etherpad lite)并操纵用户将看到的 pad。所以,如果我得到“/pad/p/something”,“something”将被处理,并相应地更改为真实 ID,例如“XYZ”。因此用户可以编辑正确的焊盘。但是,etherpad 需要很多静态的东西和 websocket,因此我想代理它,并在需要时操纵 ID


最小的工作示例: 当然,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 ) {
    res.end( "hello world" );
} );

/* the proxy */
var padProxy = httpProxy.createProxyServer( {} );

padProxy.on('error', function (err, req, res) {
    res.writeHead(500, {
        'Content-Type': 'text/plain'
    });
    res.end('some error');
});

app.all( '/pad/*' , function( req , res ) {

    var url = req.url;
    url = url.slice(4)

    /*WHY DOES THIS NOT WORK????*/
    if( url.slice(0,3) === '/p/' ) {
        url = "/p/a"
    };

    req.url = url;

    return padProxy.web(req, res , { target: "http://<etherpad server ip>:<etherpad server port>" } );

} )

/* run */
http.createServer(app).listen( 3000 , function(){
    console.log( "started" );
});

问题:网址更改和代理实际上可以工作......有点。所有的 url 都被映射以删除每个 url 前面的“/pad”,它适用于 pad、静态内容和 websocket。但是,pad ID 的映射不起作用。如果我查看“localhost:3000/pad/p/a”,我会看到“a”-pad。如果我查看“localhost:3000/pad/p/b”,我会看到“b”-pad,这不是我想要做的:/。

我做错了什么?这是 node-http-proxy、express 还是 etterpad-lite 问题?

感谢任何提示

【问题讨论】:

  • "如果我查看“localhost:3000/pad/p/a”,我会看到“a”-pad。如果我查看“localhost:3000/pad/p/b”,我看到“b”-pad,这不是我打算做的”,那你想要什么?
  • 我想看到“a”-pad,因为我尝试将 url 更改为 'url = "/p/a"'。
  • console.log(url.slice(0,3))if(url.slice.... 之前)在您的浏览器控制台上打印什么?
  • 嗯,很多(因为代理了很多静态流量)。所以结果是一个“/p/”,以及很多用于语言环境和静态内容的“/lo”或“/st”。回答问题:是的,url 重写完成。不过好像没什么效果。
  • Hint:应用urlArr = url.split('/'),这将返回具有不同索引值的Array,使用console.log(urlArr)检查值,然后应用if (url[2] == 'p')匹配网址。

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


【解决方案1】:

那么好吧。我刚刚与 etherpad-lite 开发人员聊天。由于 etherpad 的内部工作,此计划不起作用。客户端要求提供有关它在浏览器中看到的 url 的数据,因此重写是没有用的。

如果其他人遇到该问题,我会添加此答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2011-11-25
    • 2018-12-26
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多