我对stackoverflow的第一个问题;)。
我想做的事情:我想使用一条快速路由“ / pad / *”显示以太板(etherpad lite)并操纵用户将看到的垫子。因此,如果我得到“ / 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都被映射为删除每个URL前面的“ / pad”,这些URL适用于pad,静态内容和websocket。但是,pad 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的数据,因此重写是无用的。
如果其他人遇到该问题,我会添加此答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句