Http 侦听并从node.js中的同一端口请求

Http 侦听并从node.js中的同一端口请求,http,node.js,Http,Node.js,我正在测试node.js中设置的XML-RPC,并希望测试接收调用和响应的服务器以及向服务器发出调用并在同一节点会话中接收响应的客户端。如果使用相同的主机和端口运行http.createServer和http.request,则会得到: Error: ECONNREFUSED, Connection refused at Socket._onConnect (net.js:600:18) at IOWatcher.onWritable [as callback] (net.js:186:12)

我正在测试node.js中设置的XML-RPC,并希望测试接收调用和响应的服务器以及向服务器发出调用并在同一节点会话中接收响应的客户端。如果使用相同的主机和端口运行http.createServer和http.request,则会得到:

Error: ECONNREFUSED, Connection refused
at Socket._onConnect (net.js:600:18)
at IOWatcher.onWritable [as callback] (net.js:186:12)
将生成错误的测试代码:

var http = require('http')

var options = {
  host: 'localhost'
, port: 8000
}

// Set up server and start listening
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end('success')
}).listen(options.port, options.host)

// Client call
// Gets Error: ECONNREFUSED, Connection refused
var clientRequest = http.request(options, function(res) {
  res.on('data', function (chunk) {
    console.log('Called')
  })
})

clientRequest.write('')
clientRequest.end()

如果将上述代码分为两个文件并作为单独的节点实例运行,则上述代码可以正常工作,但有没有办法让上述代码在同一个节点实例上运行?

当您向HTTP服务器发出请求时,您的HTTP服务器可能未完全加载且无法运行。尝试使用setTimeout包装您的客户端请求,为服务器提供设置时间,例如:

var http = require('http')

var options = {
  host: 'localhost'
, port: 8000
}

// Set up server and start listening
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end('success')
}).listen(options.port, options.host)

setTimeout(function() {
    // Client call
    // Shouldn't get error
    var clientRequest = http.request(options, function(res) {
      res.on('data', function (chunk) {
        console.log('Called')
      })
    })

    clientRequest.write('')
    clientRequest.end()
}, 5000);

如上所述,您发出请求时,http服务器可能没有运行。使用设置超时是完全错误的。改为使用
listen
方法中的回调参数:

var http = require('http')

var options = {
  host: 'localhost'
, port: 8000
}

// Set up server and start listening
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end('success')
}).listen(options.port, options.host, function() {
  // Client call
  // No error, server is listening
  var clientRequest = http.request(options, function(res) {
    res.on('data', function (chunk) {
      console.log('Called')
    })
  })

  clientRequest.write('')
  clientRequest.end()
});