有没有办法使用 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')
答案 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重定向的更多信息。