微小的服务器/客户端设置 - 服务器没有响应。提供所有代码

时间:2011-09-30 16:14:36

标签: node.js coffeescript vows

我正在自学Coffeescript / node,当然,唯一的方法是使用TDD。这意味着我也在教自己誓言。我认为至少有两个问题。一个是 - 获取HTTP响应的异步代码在哪里?另一个是 - 为什么服务器不会给我回复回复?控制台显示“请求已发送”,但不显示“已收到请求”。

这是测试文件:

vows = require 'vows'
assert = require 'assert'
EventEmitter = require('events').EventEmitter

Server = require('./web').WebServer
Client = require('../lib/client').Client
Request = require('../lib/request').Request

PORT = 8080
SERVER = new Server PORT
SERVER.start()
CLIENT = new Client PORT, 'localhost'
REQUEST = new Request 'GET', '/'

vows
  .describe('Sending a request to the server')
  .addBatch
    'The request is sent': 
      topic: -> 
        CLIENT.transmit(REQUEST, @callback)
        return

      'The response should be what the server sent back': (err, request) ->
        body = ""
        request.on 'response', (response) ->
          response.on 'data', (chunk) -> body += chunk
        assert.equal body, /Ooga/

  .export(module)

这是WebServer对象:

Http = require('http')

exports.WebServer = class WebServer

  processRequest = (request, response) ->
    console.log 'Request received!'
    console.log request
    response.writeHead 200, {'Content-Type':'text/plain'} #, 'Content-Length':'6'}
    response.write 'Ha-ha!'
    response.end

  constructor: (@port) ->
    @server = Http.createServer processRequest

  start: ->
    @server.listen @port

  stop: ->
    @server.close()

接下来是客户端代码 - 也非常简单。

Http = require 'http'
Request = require('./request').Request

exports.Client = class Client

  constructor: (@port, @host) ->
    @httpClient = Http.createClient @port, @host
    @sentence = "I am a Client"

  transmit: (request, callback = null) ->
    req = @httpClient.request request.method, request.pathName
    req.end
    console.log "Request sent!"
    if callback
      callback(null, req)
    #req.on 'response', (res) ->
    #  callback(null, res)
      #request.on 'data', (chunk) -> callback(null, chunk)
    #callback(null, request)

最后,'请求'对象。

exports.Request = class Request
  constructor: (@method, @pathName) ->

  method: ->
    @method

  pathName: ->
    @pathname

  responseBody: ->
    @body

  setResponseBody: (body) ->
    @body = body

  appendToResponseBody: (chunk) ->
    @body += chunk

所有这一切都非常简单,我真的不知道为什么服务器似乎没有工作。我甚至不担心异步代码应该从服务器返回信息的位置,但我也想知道这一点......

1 个答案:

答案 0 :(得分:2)

啊,你犯了一个经典的错误:你写了

req.end

你的意思

req.end()

所以,尽管您的控制台声称相反,但您的请求实际上并没有被发送! (我在您的代码中也看到response.end。)

顺便说一句,Vows测试代码很漂亮,但它也是一个复杂的框架,带有一些微妙的陷阱。您可能想尝试更简单的事情,例如nodeunit

哦,如果你真的讨厌括号,你可以写do req.end而不是req.end(),但这不是一种常见的风格。