【问题标题】:Get response of url in nodejs (express/http)在nodejs中获取url的响应(express/http)
【发布时间】:2015-03-29 07:30:44
【问题描述】:

我正在尝试获取 nodejs 中两个 URL 的响应,但 http.request 存在问题。到目前为止,这是我所拥有的:

var url = "https://www.google.com/pretend/this/exists.xml";

var opt = {
    host: url.split(".com/")[0] + ".com",
    path: "/" + url.split(".com/")[1]
};
callback = function(response){
    var str = "";
    response.on('data', function(chunk){
        str += chunk;
    });
    response.on('end', function(){
        console.log(str);
    });
}
http.request(opt, callback).end();

我收到了这个错误

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

所以我用谷歌搜索并得到了这个 stackoverflow 问题 nodejs httprequest with data - getting error getaddrinfo ENOENT 其中接受的答案说您需要省略协议..但这是问题所在,我需要检查是否

https://www.google.com/pretend/this/exists.xml

给出 200,如果没有 (404),那么我需要检查是否

http://www.google.com/pretend/this/exists.xml

给出一个有效的响应

这就是问题所在,我需要检查特定协议的响应。

有什么想法吗?

编辑: 刚才看http doc(我知道懒惰),我看到了http.get example..我现在试试

编辑 2:

所以我尝试了这个

http.get(url, function(res){
    console.log("response: " + res.statusCode);
}).on('error', function(e){
    console.log("error: " + e.message);
});

显然不支持 https。

Error: Protocol:https: not supported.

【问题讨论】:

    标签: javascript node.js http express


    【解决方案1】:

    我更喜欢将 request npm 模块用于 http 请求。你会得到一个标准的回调。

    var request = require('request');
    opts = {
        url : 'https://www.google.com/pretend/this/exists.xml'
    };
    request.get(opts, function (error, response, body) {
        //Handle error, and body
    });
    
    request.post, request.put, request.head etc.
    

    这允许对错误进行相当标准的处理。

    【讨论】:

    • 更新为“get”。我不能从问题中推断出这是一个简单的应用程序。请求模块从处理分块数据中获取所有猜测,并且只在('end')上进行回调。
    【解决方案2】:

    首先你应该需要 http 或 https 模块,这取决于你想使用什么:

    var https = require('https');
    var http = require('http');
    

    http/https 模块是 Node.js 的核心之一,因此您不需要使用 npm install 安装。

    而缺少的是听错误:

    var url = 'https://www.google.com/pretend/this/exists.xml';
    
    var options = {
       host: url.split('.com/')[0] + '.com',
       path: '/' + url.split('.com/')[1]
    }; 
    
    var req = https.request(options, function (res) {
      var str = ""; 
    
      res.on('data', function (chunk) {
        str += chunk;
      });
    
      res.on('end', function () {
        console.log(str);
      });
    }); 
    
    req.on('error', function (err) {
         console.log('Error message: ' + err);
    });     
    
    req.end();
    

    我还将您的代码更新为更好的版本并澄清版本。

    【讨论】:

    • 除了错误 res.ond 之外你还改变了什么
    • 检查我引用的stackoverflow问题,我真的认为这个解决方案行不通
    • 您必须始终调用 req.end() 以表示您已完成请求 - 即使没有数据写入请求正文。
    • @MrBearAndBeer 他确实在他的帖子中用http.request(opt, callback).end(); 致电req.end()...
    • 所以,缺少的是听错误,就像你伤心@PatrickRoberts
    【解决方案3】:

    您需要监听请求中的error 事件。如果没有附加处理程序,它将抛出错误,但如果附加了一个,它将错误作为异步回调中的参数传递。此外,如果您打算发出安全请求,则应为节点使用 https 模块,而不是 http。所以试试这个:

    var https = require("https");
    
    var url = "https://www.google.com/pretend/this/exists.xml";
    
    var opt = {
        host: url.split(".com/")[0] + ".com",
        path: "/" + url.split(".com/")[1]
    };
    
    function callback(response) {
        var str = "";
    
        response.on("data", function (chunk) {
            str += chunk;
        });
    
        response.on("end", function () {
            console.log(str);
        });
    }
    
    var request = https.request(opt, callback);
    
    request.on("error", function (error) {
        console.error(error);
    });
    
    request.end();
    

    【讨论】:

    • 是的,我刚刚注意到 https 库,我是 nodejs 的新手,所以我明天试试,谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2022-01-18
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多