2010-12-09 90 views
4

我目前正忙于NodeJS,尝试使用Twitter-Search API。使用curl它可以正常工作 - 所以我的防火墙或其他方面没有任何问题。然而,我从来没有在NodeJS中得到回应。request.on(“response”,[...])永远不会被触发

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

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

在此先感谢。

回答

8

从不发送请求。

您需要使用request.end()

注:请求是不完整的。此方法仅发送请求的标题。需要调用request.end()来完成请求并检索响应。 (这听起来令人费解,但它为用户提供了一个机会来流中的主体到服务器request.write()。)

另外,response活动的参数是response object身体。您需要在response object上设置data事件,然后监听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

固定码:

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

你,先生,是我的个人英雄的一天。谢谢! :) – 2010-12-09 13:32:54

相关问题