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

Nil*_*ann 5 httpclient node.js

我目前正忙着使用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);
Run Code Online (Sandbox Code Playgroud)

并且URL也正常工作.

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

提前致谢.

Ivo*_*zel 9

永远不会发送请求.

你需要使用 request.end()

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

另外,response活动的参数是response object 不是身体.您需要在该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
Run Code Online (Sandbox Code Playgroud)

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

还有一些提示

  1. 您可能希望使用querystring.escapeurlencode搜索参数
  2. 您还需要设置Host标题,否则Twitter将返回404

固定代码:

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