Je m'enseigne Coffeescript/node et, bien sûr, la seule façon de le faire est avec TDD. Cela signifie que je m'apprends aussi à faire des vœux. Je pense qu'il y a au moins deux problèmes. Un est - où se trouve le code asynchrone pour obtenir la réponse HTTP? Et l'autre est - pourquoi le serveur ne me renvoie-t-il pas une réponse? La console affiche "Demande envoyée" mais n'affiche pas "Demande reçue".Configuration serveur/client minuscule - le serveur ne répond pas. Tout le code fourni
Voici le fichier de test:
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)
Voici l'objet 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()
Ensuite est le code client - également très simple.
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)
Enfin, l'objet 'request'.
exports.Request = class Request
constructor: (@method, @pathName) ->
method: ->
@method
pathName: ->
@pathname
responseBody: ->
@body
setResponseBody: (body) ->
@body = body
appendToResponseBody: (chunk) ->
@body += chunk
Tout cela est si simple que je ne peux vraiment pas dire pourquoi le serveur ne semble pas fonctionner. Je ne m'inquiète pas encore, quant à savoir où le code asynchrone devrait être pour récupérer l'information du serveur, mais je voudrais comprendre cela aussi ..
Gah! Je vous remercie. Je suis nouveau sur Javascript aussi. J'apprends très très vite sur les voeux gotchas, mais je veux vraiment un cadre de test dans lequel je peux utiliser Coffeescript. Je ne pensais pas que nodeunit permettait cela ... – Trevoke
Ce n'est pas très bien documenté, mais nodeunit supporte actuellement CoffeeScript depuis un an: https://github.com/caolan/nodeunit/pull/6 Exécutez simplement 'nodeunit test.coffee'. –
Neat. Maintenant, si je pouvais juste comprendre comment faire fonctionner les rappels ... Mais c'est une autre question. Venir tout de suite! – Trevoke