从POST使用.emit

时间:2013-06-23 12:56:06

标签: node.js express socket.io emit

有没有办法使用 socket.io express 发送到 node.js 的post方法中的当前socket 无需通过io.sockets.on('connection')

这是我的问题。我正在制作一个小型授权系统。当用户从表单提交时,它会通过'/login'发布数据,而不是使用onclick发出。如果用户的用户名或密码无效,则应发回消息通知失败。我宁愿不使用回调或写,因为我使用的是 Jade 模板。您可以看到我的源代码here

示例: 服务器端

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

示例 客户端

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 个答案:

答案 0 :(得分:1)

我不认为如果不再使用io.sockets.on('connection')就有办法做到这一点。无论如何,如果你正在使用res.render,你可以通过它传递数据:

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

然后在您的jade doc中执行类似的操作,打印出该消息(如果存在):

- 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重定向的更多信息。