我有这段代码:
http.get('191.168.XXX.XXX:219/query', function (res) {
...
});
IP指向另一台运行node.js的计算机,并重定向到要下载的真实文件(res.headers.location的检查在此行之后)。问题是,即使我可以使用任何浏览器访问此IP:端口,node.js只是抛出异常:
http.js:1840
throw new Error('Protocol:' + options.protocol + ' not supported.');
^
Error: Protocol 191.168.XXX.XXX: not supported.
at Object.exports.request (http.js:1840:11)
at Object.exports.get (http.js:1840:11)
at get_link (/home/pi/app.js:XXX:XX)
at init (/home/pi/app.js:XXX:XX)
at Object.cb [as oncomplete] (fs.js:168.19)
所以看来http.get不喜欢我的地址,知道我需要打电话给另一个人。
我尝试过:
file_url = {
hostname : 191.168.XXX.XXX,
port : 219,
path : 'query'
};
我改为ECONNREFUSED ......
编辑:
所以,经过一些试验和错误制作网址后,我来做这件事:
var link = {
protocol: 'http:',
hostname: '191.168.XXX.XXX',
port: 219,
path: '/?query'
};
http.get(link, function (res) {
console.log(res.statusCode + ' ' + res.headers.location);
...
});
服务器端,代码为:
function web (req, res) {
console.log('Request!');
var page = url.parse(req.url).pathname,
query = url.parse(req.url).query;
console.log(query + ' asked for smil');
if(page === '/' && smil[query]) {
log('ACCEPT', 'Redirecting to ' + smil[query]);
res.writeHead(302,
{Location: smil[query]}
);
res.end();
} else { //AUTRE
console.log('Refusing connection');
res.writeHead(404, {'Content-Type': 'text/html'});
res.end();
}
}
如果我从浏览器调用191.168.XXX.XXX,如果我有有效的参数,我会被重定向或被正确拒绝。但是从我的客户端代码中,我仍然在http.get回调之前得到了ECONNREFUSED。
答案 0 :(得分:2)
根据节点HTTP docs,get
方法与request
方法类似,后者使用节点url.parse
来解析网址。虽然url.parse
可以处理无方案的网址,但您的端口组件(:219
)中的前导冒号会导致parse
认为您的网址 有一个方案(这里是初始192.168.XXX.XXX
),这显然不是一个受支持的方案。
此处的解决方案是明确指定方案,例如http://192.168.XXX.XXX/query
。
答案 1 :(得分:0)
您使用191作为第一个地址字节,但我最强烈怀疑您的地址以192开头 - 以191开头的地址是公共地址,有关专用网络保留的地址范围的概述,请参阅RFC-1918。
所以,现在你要向互联网上的某个随机机器发送请求。