如何在node.js中超时后关闭套接字?

时间:2010-05-21 23:15:54

标签: node.js

我试图在1000ms后连接超时后关闭套接字。我可以设置一个1000ms后触发的超时,但我似乎无法破坏套接字......任何想法?

var connection = http.createClient(80, 'localhost');
var request = connection.request('GET', '/somefile.xml', {'host':'localhost'});
var start = new Date().getTime();

request.socket.setTimeout(1000);

request.socket.addListener("timeout", function() {
  request.socket.destroy();
  sys.puts("socket timeout connection closed");
});

request.addListener("response", function(response) {
  var responseBody = [];
  response.setEncoding("utf8");
  response.addListener("data", function(chunk) {
    sys.puts(chunk);
    responseBody.push(chunk);
  });

  response.addListener("end", function() {

  });
});

request.end();

返回

socket timeout connection closed
node.js:29
  if (!x) throw new Error(msg || "assertion error");
                ^
Error: assertion error
    at node.js:29:17
    at Timer.callback (net:152:20)
    at node.js:204:9

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

您可以在freenode上的IRC频道#node.js上获得更好的答案。但AFAIK节点并不是专为取消中途的东西而设计的。大多数人只是悬挂它,因为在node.js中,无论如何都没有阻塞I / O.

我同意,应该有一种方法可以在中途取消某些内容,但我认为你不应该混淆请求的内部套接字连接。这就是为什么你有http.ClientRequest抽象来为你管理套接字的原因。错误可能是因为超时确实有效,但请求对象并不期望套接字已经关闭。

希望这有帮助。