【问题标题】:io.sockets.emit not sending msg to serverio.sockets.emit 不向服务器发送消息
【发布时间】:2023-03-25 00:48:01
【问题描述】:

我正在开发一个用户登录应用程序,当有人登录时尝试io.sockets.emit("userLogin", "some msg");,不知何故服务器无法接收到消息。

服务器 app.js:

app.post('/sessions', function(req, res) {
user.authenticate(req.body.login, req.body.password, req.body.role, function(user) {    
    if (user) {
        req.session.user = user;
        console.log("correct");
        io.sockets.emit("userLogin", "some msg");
        res.redirect('/add_users');         
    } else {
        console.log("wrong");
        res.render('sessions', {locals: {
            redir: req.body.redir
        }});
    };
});
});

客户端登录.jade:

html
head
    script(src='jquery-1.7.1.js')
    script(src='http://localhost:3002/socket.io/socket.io.js')
    script(type='text/javascript')
        var socket;
        socket =  io.connect('http://localhost:3002'); 
        socket.on('userLogin', function(user) {
            console.log("userLogin: ", user)
        });
        $(function() {
            $("button").click(function() {
                $.post("/sessions", {
                    time: (new Date).toLocaleTimeString(),
                    date: (new Date).toLocaleDateString()
                });
            });
        });

body
    h1 Login
        form(action='/sessions', method='post')
            input(type='hidden', name='redir', value='redir')
            p
                lable(for='login') Login:
                input(type='text', name='login', id='login')        
            p
                lable(for='password') Password:
                input(type='text', name='password', id='password')
            p
                button Login

有趣的是,我在 app.get() 函数中有另一个发射,客户端代码相似,可以工作。所以我怀疑这与app.post() 有关?任何帮助表示赞赏,在此先感谢!

【问题讨论】:

  • 我怀疑它与 POST 有什么关系。您确定用户在单击按钮时已正确连接到 Socket.IO 服务器吗?你也试过这个代码有多个用户(你毕竟是广播)?
  • 我认为当您发布表单时,页面会刷新并且 socket.io 连接会断开。
  • @Laurent Perrin:哦,是的,你是对的,经过测试,我也注意到了,我应该如何避免连接断开?

标签: javascript node.js express socket.io pug


【解决方案1】:

提交表单会触发页面重新加载,从而断开 socket.io。您应该使用event.preventDefault 来避免这种情况。

$("button").click(function(event) {
  event.preventDefault();

  $.post("/sessions", {
    time: (new Date).toLocaleTimeString(),
    date: (new Date).toLocaleDateString()
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2014-03-16
    • 2015-01-05
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多