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