为了避免同域AJAX问题,我希望我的node.js Web服务器将所有请求从URL转发/api/BLABLA到另一个服务器,例如other_domain.com:3000/BLABLA,并且透明地向用户返回该远程服务器返回的相同内容.
所有其他URL(旁边/api/*)将直接提供,不代理.
如何使用node.js + express.js实现此目的?你能给出一个简单的代码示例吗?
(Web服务器和远程3000服务器都在我的控制之下,都运行带有express.js的node.js)
到目前为止,我发现了这个https://github.com/nodejitsu/node-http-proxy/,但阅读那里的文档并没有让我更聪明.我结束了
var proxy = new httpProxy.RoutingProxy();
app.all("/api/*", function(req, res) {
console.log("old request url " + req.url)
req.url = '/' + req.url.split('/').slice(2).join('/'); // remove the '/api' part
console.log("new request url " + req.url)
proxy.proxyRequest(req, res, {
host: "other_domain.com",
port: 3000
});
});
Run Code Online (Sandbox Code Playgroud)
但没有任何东西返回原始的Web服务器(或最终用户),所以没有运气.
我正在尝试利用节点请求模块,但文档并不是那么好.如果我向有效资源发出请求并将其传递给Writable Stream,那么一切正常.但是,如果我向无效对象发出请求,则仍会创建可写流.例如,请使用以下代码段:
var x = request("http://localhost:3000/foo.jpg");
var st = fs.createWriteStream("foo.jpg");
x.pipe(st);
Run Code Online (Sandbox Code Playgroud)
如果服务器上存在foo.jpg资源,则数据将通过管道传输到流,并在服务器上创建文件.但是,如果服务器上不存在foo.jpg ,则仍会创建空白容器文件.似乎没有任何错误事件或任何可用于确定请求是否返回404的内容.我尝试过以下内容:
var x = request("http://localhost:3000/foo.jpg", function(err, response, body) {
if(response.statusCode === 200) {
// Success
var st = fs.createWriteStream("foo.jpg");
x.pipe(st);
}
});
Run Code Online (Sandbox Code Playgroud)
并且:
request("http://localhost:3000/foo.jpg", function(err, response, body) {
if(response.statusCode === 200) {
// Success
var x = response.request;
var st = fs.createWriteStream("foo.jpg");
x.pipe(st);
}
});
Run Code Online (Sandbox Code Playgroud)
无济于事.这个想法非常简单; 我只想将URL标识的文件复制到本地服务器.如果请求无效(404等),请不要管道文件; 如果请求有效,则管道文件.有什么建议?
我想做什么:
代理一个java api,它运行在https://127.0.0.1:443/api/我的UI上,运行在非SSL http://127.0.0.1:1337/上,以便绕过一些CORS问题.
我的尝试:
:8080/index.html代理1338到:8080/api/我的问题:
用户界面很好......但我无法点击API :8080/api/httpSession/init
是的,我仍然可以点击API https://localhost/api/httpSession/init
api.js - Renders index.html at:1337
var app = express();
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
var options = {
changeOrigin: true,
target: {
https: true
}
};
httpProxy.createServer(443, '127.0.0.1', options).listen(1338);
Run Code Online (Sandbox Code Playgroud)
start.js - 将代号1337和1338转换为8080
// First I start my two servers
uiServer.start(); // renders index.html at 1337
apiServer.start(); // …Run Code Online (Sandbox Code Playgroud)