簡體   English   中英

微小的服務器/客戶端設置 - 服務器沒有響應。 提供所有代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM