Question

Je veux demande (POST) corps de http.ServerRequest, mais faites pas droit lorsque ma fonction de demande est appelée, mais seulement après un certain temps (requête Redis).

J'ai un exemple très simple pour illustrer:

var http = require('http'),
    sys = require('sys');

http.createServer(function (req, res) {
    sys.puts("Got request");
    req.pause();
    setTimeout(function() { // In real code I'm accessing Redis here.
        var body = "";
        req.addListener('data', function (chunk) {
            sys.puts("Got 'data' event");
            body += chunk;
        });
        req.addListener('end', function () {
            sys.puts("Got 'end' event");
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end(body);
        });
        req.resume();
    }, 10);
}).listen(8000);

Dans cet exemple, les événements data et end sont complètement raté, même si j'appelle req.pause() / req.resume(), donc la demande « bloqué » de.

Si je commente sur appel setTimeout() et faire tout droit en fonction de la demande, tout fonctionne comme prévu. Mais je veux interroger Redis voir chaque fois valide de la demande. Les grands postes sont le téléchargement de fichiers, et je ne veux pas perdre le temps d'attente pour le téléchargement échoue à remplir.

La façon simple de le faire est de retarder le POST pour quelques millisecondes (dans mon cas POTEAUX prendrait au moins plusieurs secondes, ce retard minuscule est tout à fait insignifiante). L'un est plus propre pour commencer l'analyse des données entrantes, valider simultanément la demande et déposer trouvé de la connexion si la demande invalide.

La question est: comment je ferais tout cela? J'utilise la version Node.js 0.1.97-14-g0055dd1 si cette question est importante.

Merci pour toutes suggestions.

Était-ce utile?

La solution

Je ne sais pas quand je fais ce droit, mais cela semble bon pour moi:

var http = require('http'),
    sys = require('sys');

http.createServer(function (req, res) {
    var body = "",
        body_complete = false,
        wait_complete = false;
    sys.debug("Got request");

    // This will be called on each process' completion
    var final_cb = function(err) {
        if (err) throw new Error(err);
        if (body_complete && wait_complete) {
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end(body);
        }
    };

    // Async process one: get POST body
    req.addListener('data', function (chunk) {
        sys.debug("Got 'data' event");
        body += chunk;
    });
    req.addListener('end', function () {
        sys.debug("Got 'end' event");
        body_complete = true;
        final_cb(null)
    });

    // Async process two: wait 10ms
    setTimeout(function() { // In real code I'm accessing Redis here.
        sys.debug("Timeout passed");
        if (false) { // Okay, timeout can't go wrong
            res.writeHead(403);
            res.end('Sorry');
        }
        wait_complete = true;
        final_cb(null);
    }, 10);
}).listen(8000);

Addition: Lorsque Connect middleware veut effectuer certaines demandes asynchonous (à savoir passer le contrôle à la boucle d'événements), il fonctionne autour de cette façon:

var pause = utils.pause(req);
fs.readFile(path, function(){
    next();
    pause.resume();
});

utils.pause() est un hack pour tamponner les événements en attente .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top