错误:协议:191.168.XXX.XXX:不支持

时间:2014-04-04 16:20:20

标签: javascript node.js

我有这段代码:

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。

2 个答案:

答案 0 :(得分:2)

根据节点HTTP docsget方法与request方法类似,后者使用节点url.parse来解析网址。虽然url.parse 可以处理无方案的网址,但您的端口组件(:219)中的前导冒号会导致parse认为您的网址 有一个方案(这里是初始192.168.XXX.XXX),这显然不是一个受支持的方案。

此处的解决方案是明确指定方案,例如http://192.168.XXX.XXX/query

答案 1 :(得分:0)

您使用191作为第一个地址字节,但我最强烈怀疑您的地址以192开头 - 以191开头的地址是公共地址,有关专用网络保留的地址范围的概述,请参阅RFC-1918

所以,现在你要向互联网上的某个随机机器发送请求。