我正在使用nodejs服务器来模拟后端。服务器是一个Web服务器,并在不同的请求上返回json对象,工作完美无缺。现在我必须从另一个域获取json对象,所以我必须代理服务器。我在npm中找到了一个名为request的包。我可以得到一个简单的例子,但我必须转发整个网页。
我的代理代码如下:
var $express = require('express'),
$http = require('http'),
$request = require('request'),
$url = require('url'),
$path = require('path'),
$util = require('util'),
$mime = require('mime');
var app = $express();
app.configure(function(){
app.set('port', process.env.PORT || 9090);
app.use($express.bodyParser());
app.use($express.methodOverride());
app.use('/', function(req, res){
var apiUrl = 'http://localhost:9091';
console.log(apiUrl);
var url = apiUrl + req.url;
req.pipe($request(url).pipe(res));
});
});
$http.createServer(app).listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
if (process.argv.length > 2 && process.argv.indexOf('-open') > -1) {
var open = require("open");
open('http://localhost:' + app.get('port') + '/', function (error) {
if (error !== null) {
console.log("Unable to lauch application in browser. Please install 'Firefox' or 'Chrome'");
}
});
}
})
我正在登录真实服务器并且它正常运行,我可以跟踪获取响应,但是正文是空的。我只想通过request.pipe函数从nodejs服务器传递整个网站。有什么想法吗?
答案 0 :(得分:3)
由于在Node.js中,a.pipe(b)
返回b
(请参阅documentation),因此您的代码与此相同:
// req.pipe($request(url).pipe(res))
// is equivalent to
$request(url).pipe(res);
req.pipe(res);
由于您只需要代理,因此无需将req
传递到res
(此处将多个可读流管道传输到一个可写流中没有意义),只需保留此内容即可你的代理人会工作:
$request(url).pipe(res);