0

有没有办法在node.jssocket的 post 方法中使用socket.ioexpress发射到电流,而不必经过?io.sockets.on('connection')

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

示例: 服务器端

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')
4

1 回答 1

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 将被发送回浏览器并重定向用户。如果登录无效,则返回并显示错误消息。查看此问题以了解有关提交表单然后通过 jQuery 重定向的更多信息。

于 2013-06-23T18:01:20.333 回答