[英]Tiny server/client setup - server doesn't respond. All code provided
我正在自學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
這一切都很簡單,我真的不知道為什么服務器似乎沒有工作。 我甚至不擔心異步代碼應該從服務器返回信息的位置,但我也想知道它...
啊,你犯了一個經典錯誤:你寫道
req.end
在哪里你的意思
req.end()
因此,盡管您的控制台聲稱相反,但您的請求實際上並未真正被發送! (我在你的代碼中看到了一個response.end
。)
順便說一句,Vows測試代碼很漂亮,但它也是一個復雜的框架,帶有一些微妙的陷阱。 你可能想嘗試一些更簡單的東西,比如nodeunit 。
哦,如果你真的討厭括號,你可以寫do req.end
而不是req.end()
,但這不是一種常見的風格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.