我在 stackoverflow 上的第一个问题;)。
<小时/>我尝试做的事情: 我想使用快速路由“/pad/*”来显示 etherpad (etherpad lite) 并操纵用户将看到的 pad。所以,如果我得到“/pad/p/something”,“something”将被处理,并相应地更改为真实ID,例如“XYZ”。因此用户可以编辑正确的焊盘。但是,etherpad 需要大量静态内容和 websockets,因此我想代理它,并在需要时操纵 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”,该 url 适用于 pad、静态内容和 websockets。但是,焊盘 ID 的映射不起作用。如果我查看“localhost:3000/pad/p/a”,我会看到“a”-pad。如果我查看“localhost:3000/pad/p/b”,我会看到“b”-pad,这不是我想要做的:/。
我做错了什么?这是一个 node-http-proxy、express 或 etterpad-lite 问题吗?
任何提示表示赞赏
最佳答案
那么好吧。我刚刚与 etherpad-lite 开发人员聊天。由于 etherpad 的内部工作原理,该计划不起作用。客户端请求有关在浏览器中看到的 url 的数据,因此重写是没有用的。
如果其他人遇到这个问题,我添加了这个答案。
关于Node.js:使用快速路由进行 url 重写以代理到 etherpad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26358939/