我正在自学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
所有这一切都非常简单,我真的不知道为什么服务器似乎没有工作。我甚至不担心异步代码应该从服务器返回信息的位置,但我也想知道这一点......
答案 0 :(得分:2)
啊,你犯了一个经典的错误:你写了
req.end
你的意思
req.end()
所以,尽管您的控制台声称相反,但您的请求实际上并没有被发送! (我在您的代码中也看到response.end
。)
顺便说一句,Vows测试代码很漂亮,但它也是一个复杂的框架,带有一些微妙的陷阱。您可能想尝试更简单的事情,例如nodeunit。
哦,如果你真的讨厌括号,你可以写do req.end
而不是req.end()
,但这不是一种常见的风格。