request.on(“response”,[...])永远不会被解雇

时间:2010-12-09 13:14:05

标签: node.js httpclient

我目前正忙着使用NodeJS并尝试使用Twitter-Search API。使用curl它可以正常工作 - 所以防火墙或其他什么都没有问题。然而,我从未在NodeJS中得到回应。

var sys = require("sys"),
    http = require("http"),
    events = require("events");

sys.puts("Hi there… ");
var client = http.createClient(80, "search.twitter.com"),
    body = "",
    query = "foobar";

function getResults() {
  sys.puts("fetching for "+query);
  var request = client.request("GET", "/search.json?q="+query);
  request.on("response", function(data){
    /* this somehow never gets fired :( */
    sys.puts("BODY:"+ data);
  });
}

var interval = setInterval(getResults, 5000);

URL is also working

欢迎任何提示或解决方案!

提前致谢。

1 个答案:

答案 0 :(得分:8)

从不发送请求。

您需要使用request.end()

  

注意:请求未完成。此方法仅发送请求的标头。需要调用request.end()来完成请求并检索响应。 (这听起来很复杂,但它为用户提供了使用request.write()将主体流式传输到服务器的机会。)

response事件'参数也是response object NOT 正文。您需要在data上设置response object事件,然后侦听end事件以确保获得所有数据。

request.on('response', function (response) {
  var body = '';
  response.on('data', function (chunk) {
    body += chunk;
  });
  response.on('end', function () {
    console.log('BODY: ' + body);
  });
});
request.end(); // start the request

请参阅:http://nodejs.org/api/http.html#http_class_http_clientrequest

更多提示

  1. 您可能希望使用querystring.escape对搜索参数进行urlencode
  2. 您还需要设置Host标头,否则Twitter将返回404
  3. 固定代码:

    var querystring = require('querystring');
    ...
    var request = client.request("GET", "/search.json?q=" + querystring.escape(query), {'Host': 'search.twitter.com'});