我正在尝试为外部网站创建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
标头中指定的数量不匹配(表示检索的字节数较少)。
我无法弄清楚如何正确返回从远程服务器检索到的确切响应。非常感谢任何帮助。
答案 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);
});