Node.js代理从外部网站返回确切的响应

时间:2013-05-26 06:37:54

标签: node.js express

我正在尝试为外部网站创建express.js代理,以便从那里获取音频数据。我知道像http-proxy这样的模块,但是当只有一个url-bound请求通过代理时,我认为它们是过分的。我正在使用以下代码:

express.get('/proxy', function (req, res) {

    var options ={
        host: "website.com",
        port: 80,
        path: "/audio/test.mp3",
        method: 'GET'
    };

    http.get(options, function (audioRes) {
        var data = [], dataLen = 0;

        audioRes.on('data', function(chunk) {
            data.push(chunk);
            dataLen += chunk.length;
        })
        .on('end', function() {
            var buf = new Buffer(dataLen);
            res.set(audioRes.headers);
            res.send(buf);
        });
    })
    .on('error', function (error) {
        console.log(error.message);
    });

});

我得到了回复,但无法将其解码为有效音频。在使用Fiddler进行调试时,我发现服务器发送的咬合次数与Content-Length标头中指定的数量不匹配(表示检索的字节数较少)。

我无法弄清楚如何正确返回从远程服务器检索到的确切响应。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

要通过代理发送请求,您可以在Host标头中设置代理网址。此外,您还必须指定您尝试通过代理访问的外部资源的完整URL。

var http = require("http");

var options = {
  host: "proxy",
  port: 8080,
  path: "http://www.google.com",  //full URL
  headers: {
    Host: "10.1.2.3"              //your proxy location
  }
};
http.get(options, function(res) {
  console.log(res);
});

我不确定为什么它没有返回完整的回复。你能发布你的选择吗。

更新

在放置选项

后,在/proxy内尝试此操作
http.get(options, function (audioRes) {
    audioRes.pipe(res);
})
.on('error', function (error) {
    console.log(error.message);
});