Настройка крошечного сервера / клиента - сервер не отвечает. Весь код предоставлен - PullRequest
0 голосов
/ 30 сентября 2011

Я учу себя 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 Ответ

2 голосов
/ 30 сентября 2011

Ах, вы сделали классическую ошибку: вы написали

req.end

, где вы имели в виду

req.end()

Итак, ваш запрос на самом деле вообще не отправлялся, несмотря напретензии вашей консоли наоборот!(Я также вижу response.end в вашем коде.)

Кстати, тестовый код Vows хорош, но это также сложная структура с некоторыми тонкими хитростями.Вы можете попробовать что-нибудь попроще, например nodeunit .

О, и если вы действительно ненавидите скобки, вы можете написать do req.end вместо req.end(), но это необщий стиль.

...