2011-09-30 3 views
0

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 ..

Répondre

2

Ah, vous avez fait une erreur classique : vous avez écrit

req.end 

où vous vouliez dire

req.end() 

Ainsi, votre demande n'a pas été réellement envoyé à tous, en dépit des affirmations de votre console au contraire! Par ailleurs, le code de test de Vows est joli, mais c'est aussi un framework complexe avec quelques pièges subtiles. Vous pouvez essayer quelque chose de plus simple, comme nodeunit. Oh, et si vous détestez vraiment les parenthèses, vous pouvez écrire do req.end au lieu de req.end(), mais ce n'est pas un style commun.

+0

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

+1

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'. –

+0

Neat. Maintenant, si je pouvais juste comprendre comment faire fonctionner les rappels ... Mais c'est une autre question. Venir tout de suite! – Trevoke