Настройка крошечного сервера / клиента - сервер не отвечает. Весь код предоставлен
Я учу себя 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
Все это так просто, что я не могу понять, почему сервер не работает. Я даже не беспокоюсь о том, где должен находиться асинхронный код для получения информации с сервера, но я бы тоже хотел это выяснить...
1 ответ
Ах, вы сделали классическую ошибку: вы написали
req.end
где ты имел ввиду
req.end()
Таким образом, ваш запрос на самом деле не был отправлен, несмотря на заявления вашей консоли об обратном! (Я вижу response.end
в вашем коде.)
Кстати, тестовый код Vows хорош, но это также сложная структура с некоторыми тонкими хитростями. Вы можете попробовать что-то попроще, например, узел узла.
О, и если вы действительно ненавидите скобки, вы можете написать do req.end
вместо req.end()
, но это не общий стиль.