2013-12-09 107 views
1

我有一段代碼應該做一個http獲取請求。程序成功退出沒有錯誤,但我沒有看到任何迴應,它甚至沒有進入回調函數!起初我以爲這是因爲http是異步的,並且最後放了一個大的循環,但是這也不起作用。有誰知道這個問題?只有第一個控制檯日誌sendHttpRequest和444被打印。我也嘗試了http.get,但它也沒有工作。Nodejs的http請求不起作用

function sendHttpRequest (url, callBack) { 
    console.log("sendHttpRequest"); 
    //constrct options 
    var options = { 
     host: 'www.google.com', 
     path: '/index.html', 
     method: 'GET', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded' 
     } 
    }; 

    http.get("http://www.google.com/index.html", function(res) { 
     console.log("Got response: " + res.statusCode); 
    }); 

    var req = http.request(options, function(res) { 
     console.log("333"); 
     var output = ''; 
     console.log(options.host + ':' + res.statusCode); 
     res.setEncoding('utf8'); 

     res.on('data', function (chunk) { 
      console.log("DATATATAT!") 
      output += chunk; 
     }); 

     res.on('end', function() { 
      console.log('222'); 
      var obj = JSON.parse(output); 
      callBack(res.statusCode, obj); 
     }); 
    }); 

    req.on('error', function (err) { 
     console.log('error: ' + err.message); 
    }); 

    req.end(); 
    console.log("444"); 
    } 
} 
+0

有人說谷歌沒有「/指數.html「,我刪除了它,但仍然無效。它只是沒有進入回調。沒有反應。 – user3084182

+0

你打這個電話過得怎麼樣?這有幾個問題,但除此之外,我可以看到所有的'console.log',並且回調函數也被調用。你也返回HTML,'JSON.parse'永遠不會工作。 – matth

+0

@ making3嗨,我把它封裝成一個模塊,並從一個咕task任務中調用它,但不知何故,我只能看到第一個控制檯日誌和最後一個,它是444.我必須在grunt或這個模塊中調用異步等待迴應?謝謝!對於json部分,原本我打算解析一個json,這樣不會有問題。 – user3084182

回答

4

更新

的OP接收到響應之前終止該任務咕嚕;加入async並回調固定它的任務。


如果我把你的代碼的功能之外,在前面加上var http = require('http');我得到迴應,直到222,此時它與SyntaxError: Unexpected token <死亡。這實際上是因爲您試圖將HTML響應解析爲JSON而死亡。

如果粘貼下面的整個腳本並運行它端到端,控制檯與死亡:

undefined:1 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
^ 
SyntaxError: Unexpected token < 
    at Object.parse (native) 
    at IncomingMessage.<anonymous> (/Users/you/nodetest/tmp/test.js:31:28) 
    at IncomingMessage.EventEmitter.emit (events.js:120:20) 
    at _stream_readable.js:896:16 
    at process._tickCallback (node.js:599:11) 

腳本:

var http = require('http'); 

console.log("sendHttpRequest"); 
//constrct options 
var options = { 
    host: 'www.google.com', 
    path: '/index.html', 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}; 

http.get("http://www.google.com/index.html", function(res) { 
    console.log("Got response: " + res.statusCode); 
}); 

var req = http.request(options, function(res) { 
    console.log("333"); 
    var output = ''; 
    console.log(options.host + ':' + res.statusCode); 
    res.setEncoding('utf8'); 

    res.on('data', function (chunk) { 
     console.log("DATATATAT!") 
     output += chunk; 
    }); 

    res.on('end', function() { 
     console.log('222'); 
     // it's failing on the next line, because the output 
     // it's receiving from Google is HTML, not JSON. 
     // If you comment out this line and simply 
     // "console.log(output)" you'll see the HTML response. 
     var obj = JSON.parse(output); 
     callBack(res.statusCode, obj); 
    }); 
}); 

req.on('error', function (err) { 
    console.log('error: ' + err.message); 
}); 

req.end(); 
console.log("444"); 
+0

嗨,我把這個包裝起來作爲一個模塊,並從一個咕task任務調用它,但不知何故,我只看到第一個控制檯日誌和最後一個,這是444.我必須調用異步咕嚕或此模塊等待迴應?謝謝!對於json部分,原本我打算解析一個json,這樣不會有問題。 – user3084182

+0

你將需要在你的問題中提供包裝,以便實際確定 - 開箱即用,你可以看到這可以工作,但是如果你的咕嚕任務在結束之前終止(並且正在運行async),這可能是一個不錯的選擇,grunt不會等待它完成。 – brandonscript

+0

原來你是對的!在得到響應之前,咕task任務終止了!我添加了異步和回調,它工作。非常感謝!! :) – user3084182