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 ) { 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都被映射到删除每个url前面的“/ pad”,这些url适用于pad,静态内容和websocket。 但是,pad ID的映射不起作用。 如果我看“localhost:3000 / pad / p / a”,我会看到“a”-pad。 如果我看“localhost:3000 / pad / p / b”,我看到“b”-pad,这不是我打算做的:/。

我究竟做错了什么? 这是一个节点的http代理,express或etterpad-lite的问题?

任何暗示是赞赏

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

如果有人遇到这个问题,我添加了这个答案。