2012-10-13 1 views
0

Mon code Node.js pour se connecter au serveur Redis est comme ceErreur null indéfinie dans node.js avec le serveur redis?

var http = require("http"), 
    querystring = require("querystring"), 
    redis = require("redis"), 
    db = redis.createClient(6379, "127.0.0.1"); 

db.set("Jaime", "Developer", function(){}); 

http.createServer(function(req, res) { 
    var qs = querystring.parse(req.url.split("?")[1]), 
    firstName = qs.firstName; 

    db.get(firstName, function(err, lastName) { 
    var userName = firstName + " " + lastName, 
     html = "<!doctype html>" + 
     "<html><head><title>Hello " + userName + "</title></head>" + 
     "<body><h1>Hello, " + userName + "!</h1></body><h2>I am in this page</h2></html>"; 

    res.end(html); 

    }); 
}).listen(8000); 

mon serveur Redis est également en cours d'exécution et de donner un message comme celui-ci

[3648] 13 octobre 11:43:00 * Le serveur est maintenant prêt à accepter les connexions sur le port 6 379 [3648] 13 Oct 11:43:01 - DB 0: 3 clés (0 volatile) dans 4 slots HT. [3648] 13 Oct 11:43:01 - 0 clients connectés (0 esclaves), 672976 octets en cours d'utilisation [3648] 13 Oct 11:43:06 - DB 0: 3 touches (0 volatile) dans 4 emplacements HT. [3648] 13 oct 11:43:06 - 0 clients connectés (0 esclaves), 672976 octets utilisés

lorsque je le connecte avec le navigateur (http: // localhost: 8000) l'état du serveur donne

[3648] 13 octobre 11:45:07 - Accepté 127.0.0.1:1715 [3648] 13 octobre 11:45:10 - DB 0: 3 clés (0 volatile) dans les quatre fentes HT. [3648] 13 oct 11:45:11 - 1 clients connectés (0 esclaves), 680892 octets utilisés

et le navigateur inscrites dans ce

Bonjour, null undefined! Je suis dans cette page

Je suis un tout nouveau à cela .. Je ne sais pas comment faire ce travail s'il vous plaît aidez-moi.

+1

Ajoutez un 'console.log (err);' dans le rappel. Qu'est-ce que cela revient? – Menztrual

Répondre

1

Vous avez deux problèmes. Tout d'abord, db.set est une opération asynchrone, mais vous avez une fonction anonyme dans le rappel sans rien, donc il n'y a aucune garantie que l'opération est terminée au moment où vous descendez à l'obtenir.

Vous devez imbriquer le code ultérieur dans le rappel db.set (peut être désordonné) ou utiliser une bibliothèque de contrôle de flux pour un noeud tel que async. Deuxièmement, vous récupérez firstName à partir des params de requête, puis ne passez rien dans ... D'où le premier non défini, eghttp: // localhost: 8000 /? FirstName = Jaime (c'est en fait ce qui cause le Erreur).

Vous devez obtenir les deux à la fois pour que cela fonctionne. Je lisais les opérations asynchrones dans les bibliothèques de nœuds et asynchrones.

(modifié pour ajouter des liens).

+0

quand je donne http: // localhost: 8000 /? FirstName = Jaime son donner ** Bonjour, développeur Jaime! Je suis dans cette page ** donc je pense que le code fonctionne? Je vais passer par le lien ... merci pour la réponse. @cliftonc – Gopipuli

+2

Votre première remarque (concernant le fait db.set is asynchronous) n'est pas pertinent ici, car les commandes envoyées sur la même connexion Redis seront traitées dans l'ordre (et Redis est à un seul thread). Donc le SET est * toujours * envoyé avant le GET, et donc la réponse du GET ne peut pas être traitée avant le SET. –

+1

Vous avez 100% raison, donc j'ai voté votre commentaire car beaucoup ne réalisent pas cela ... mais s'il y avait une erreur dans le SET (par exemple la mémoire du serveur Redis à la limite par exemple) vous le regretteriez et le GET échouerait alors. – cliftonc