2014-10-14 9 views
1

내 첫 번째 질문에 stackoverflow;).Node.js : url에 대한 익스프레스 라우트를 사용하여 프록시에 프록시로


내가 수행하려고 할 것 : 내가 명시 적 경로 "/ 패드/*"etherpads을 표시하려면 (etherpad 라이트)를 사용하고 사용자가 표시되는 내용 패드를 조작 할 수 있습니다. 그래서 "/ pad/p/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 앞의 "/ 패드"를 제거하도록 매핑됩니다. 하지만 패드 ID의 매핑이 작동하지 않습니다. "localhost : 3000/pad/p/a"를 보면 "a"-pad가 표시됩니다. "localhost : 3000/pad/p/b"를 보면 "b"- 패드가 있는데, 의도하지 않은 것입니다. /.

내가 뭘 잘못하고 있니? 이것은 노드 -http-proxy, express 또는 etterpad-lite 문제입니까?

모든 힌트를 환영합니다.

+0

""localhost : 3000/pad/p/a "를 보면"a "- 패드가 보입니다."localhost : 3000/pad/p/b "를 보면"b "- 내가하려는 의도가 아닌 패드", 그럼 무엇을 원하니? – Ravi

+0

"url ="/ p/a " '로 URL을 변경하려고하면"a "-pad를보고 싶습니다. – Wilm

+0

'console.log (url.slice (0,3))'('if (url.slice ....') 이전에 브라우저 콘솔에 출력됩니까?) – Ravi

답변

1

. 방금 etherpad -ite devs와 채팅했습니다. 이 계획은 etherpad의 내부 작업으로 인해 작동하지 않습니다. 클라이언트는 브라우저에서 볼 수있는 URL에 관한 데이터를 요청하므로 다시 쓸 수 없습니다.

다른 사람이 문제를 발견하면이 답변을 추가했습니다.