2013-06-23 5 views
0

Est-il possible d'émettre à l'socket courant dans une méthode post de Node.js utilisant socket.io et exprimer sans avoir à passer par le io.sockets.on('connection')?En utilisant .emit de POST

Voici ma question. Je fais un mini système d'autorisation. Lorsque l'utilisateur soumet à partir du formulaire, il publie les données via '/login' au lieu d'utiliser un onclick émettre. Si l'utilisateur a un nom d'utilisateur ou un mot de passe invalide, il doit envoyer un message indiquant qu'il a échoué. Je préférerais ne pas utiliser le callback ou écrire car j'utilise un template Jade. Vous pouvez voir mon code source here.

Exemple: côté serveur

var LoggIn = require('./lib/login.js'); // <-- Middle-ware 
app.post('/login', function (req, res){ 
    LoggIn.authenticate(req.body.user, req.body.password, function(user, msg) { 
     if (user) { 
      req.session.user = user; 
       res.redirect('/'); 
     } else { 
      res.render('login'); 
      //res.emit('loginFail', 'You have entered an invalid user/password!<br>Try Again.); // <-- wishing for something like this 
       console.log('Login Failed! : ' + msg); 
     } 
    }); 
}); 

Exemple côté client

JS

var status = document.getElementById('status'); 
socket.on('loginFail', function(msg) { 
    status.innerHTML = msg; 
}); 

Form Jade

#status 
form#loginForm(method='POST', action='/login') 
      input(name='user', placeholder='User Name') 
      br 
      input(name='password', placeholder='Password', type='password') 
      br 
      input(value='Sign In', type='submit') 
+1

Au lieu d'utiliser res.emit, avez-vous essayé d'utiliser le socket qui a été initialisé sur le serveur? Exemple: 'socket.emit ('loginFail', 'Can not log in');' Aussi je ne sais pas si vous pouvez utiliser des sockets pour cela car le client aurait encore besoin de se connecter après le rendu de la page, dans lequel ils manquerait l'émission. Y at-il une raison pour laquelle vous ne pouvez pas faire quelque chose comme ceci 'res.render ('login', {error: 'Invalid credentials'});' et ensuite afficher le statut s'il existe – JasonM

+0

Je n'ai même jamais pensé essayer et passer le des données avec la méthode de rendu. Jade et Node.js sont encore assez nouveaux pour moi alors j'apprécie vraiment le conseil. –

Répondre

1

Je ne pense pas qu'il existe un moyen de le faire sans utiliser à nouveau io.sockets.on ('connection'). Si vous utilisez res.render de toute façon, vous pouvez transmettre des données à travers ce que:

res.render('login', {msg: 'You have entered an invalid user/password!<br>Try Again.'}); 

puis faire quelque chose comme ça dans votre jade doc pour imprimer le message si elle existe:

- if (msg) 
    p #{msg} 

Mais le problème avec ceci est qu'il recharge la page, ce que je ne pense pas que vous vouliez si vous essayez juste d'afficher un message simple. Vous pouvez utiliser jQuery pour soumettre le formulaire sur le côté client à la place:

$('#myForm').submit(function(e){ 
     e.preventDefault(); 
     $.post(
      $(this).attr("action"), // The URL to send form data to 
      $(this).serialize(), // Serializes the form data to be sent 
      // Success callback function 
      function(data){ 
       if(data.url){ 
        window.location.href = data.url; 
       } else{ 
        $('#msg').html(data.msg); 
       } 
      } 
     ); 
    }); 

vous sur le côté serveur ont:

app.post('/login', function(req, res){ 
    // do whatever you need to check if the login is valid 
    if(validLogin){ 
     res.send({url: myURL}); // send url that user should be redirected to 
    } else{ 
     res.send({msg: 'You have entered an invalid user/password!<br>Try Again.'}); 
    } 
}); 

Donc, si la connexion est valide, l'URL de redirection est envoyé retour au navigateur et l'utilisateur est redirigé. Si la connexion n'est pas valide, le message d'erreur est renvoyé et est affiché. Consultez this question pour en savoir plus sur la soumission d'un formulaire, puis sur la redirection via jQuery.

+0

En fait, je pense que votre première suggestion est bonne. Cela ne me dérange pas un rechargement de page avec un tel contenu et il y a aussi des configurations de chemins qui dépendent de ce que j'ai fait. Pour mes pages principales, je pense que vous avez un bon point cependant. Merci pour votre avis. –