0

私は自分自身で Coffeescript/node を学んでいますが、もちろん、これを行う唯一の方法は TDD を使用することです。つまり、私は自分自身に誓いを教えているということです。少なくとも 2 つの問題があると思います。1 つは、HTTP 応答を取得するための非同期コードはどこにあるのかということです。もう 1 つは、サーバーが応答を返してくれないのはなぜですか? コンソールに「Request sent」は表示されますが、「Request received」は表示されません。

テストファイルは次のとおりです。

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

これはすべて非常に単純であるため、サーバーが機能していないように見える理由がわかりません。サーバーから情報を取得するために非同期コードがどこにあるべきかについては、まだ心配していませんが、それも把握したいと思います..

4

1 に答える 1

2

ああ、あなたは古典的な間違いを犯しました:あなたは書いた

req.end

あなたが意味したところ

req.end()

したがって、コンソールが反対の主張をしているにもかかわらず、リクエストは実際にはまったく送信されていませんでした。(私はresponse.endあなたのコードにもaがあります。)

ちなみに、Vowsのテストコードはきれいですが、いくつかの微妙な落とし穴がある複雑なフレームワークでもあります。nodeunitのようなもっと単純なものを試してみることをお勧めします。

ああ、もしあなたが本当に括弧が嫌いなら、do req.end代わりに書くことができますreq.end()が、これは一般的なスタイルではありません。

于 2011-09-30T17:32:36.197 に答える