2013-06-23 2 views
0

Есть ли способ, чтобы излучать к текущему socket внутри метода пост node.js с использованием Socket.io и выразить без необходимости проходить через io.sockets.on('connection')?Использование .emit от POST

Вот моя проблема. Я делаю мини-систему авторизации. Когда пользователь отправляется из формы, он отправляет данные через '/login' вместо использования onclick. Если у пользователя есть недопустимое имя пользователя или пароль, он должен отправить сообщение с уведомлением об ошибке. Я бы предпочел не использовать обратный вызов или написать, потому что я использую шаблон Jade. Вы можете увидеть мой исходный код here.

Пример: Server Side

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); 
     } 
    }); 
}); 

Пример Client Side

JS

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

Джейд Форма

#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

Вместо использования res.emit вы пытались использовать сокет, который был инициализирован на сервере? Пример: 'socket.emit ('loginFail', 'Can not log in');' Также я не знаю, можете ли вы использовать сокеты для этого, поскольку клиенту все равно нужно будет подключиться после рендеринга страницы, в которой они пропустит излучение. Есть ли причина, по которой вы не можете сделать что-то вроде этого: res.render ('login', {error: 'Invalid credentials'}) ;, а затем отобразить статус, если он существует – JasonM

+0

Я даже не думал попробовать и передать данные с методом рендеринга. Jade и Node.js по-прежнему новинка для меня, поэтому я очень ценю совет. –

ответ

1

Я не думаю, что есть способ сделать это, не используя io.sockets.on ('connection') еще раз. Если вы используете res.render в любом случае, вы можете передавать данные через что, хотя:

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

, а затем сделать что-то подобное в вашем нефрите документе на печать сообщения, если оно существует:

- if (msg) 
    p #{msg} 

Но проблема с этим заключается в том, что он перезагружает страницу, чего я не думаю, что вы хотите, если просто пытаетесь отобразить простое сообщение обратной связи. Вы можете использовать JQuery для отправки формы на стороне клиента вместо:

$('#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); 
       } 
      } 
     ); 
    }); 

На серверной стороне вы бы:

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.'}); 
    } 
}); 

Так, если Логин является действительным, URL для перенаправления отправляется обратно в браузер, и пользователь перенаправляется. Если вход недействителен, сообщение об ошибке отправляется обратно и отображается. Зайдите в this question для получения дополнительной информации о отправке формы, а затем переадресации через jQuery.

+0

На самом деле, я думаю, что ваше первое предложение является хорошим. Я не пробовал перезагрузку страницы с таким небольшим содержанием, и есть также некоторые конфигурации путей, которые полагаются на то, что я сделал. Для моих главных страниц я думаю, что у вас есть хороший момент. Спасибо за ваш отзыв. –