【问题标题】:Server sent Message to the client but the Message is not display in the Console服务器向客户端发送消息,但消息未显示在控制台中
【发布时间】:2018-04-02 02:29:39
【问题描述】:

我使用 nodejs 作为服务器。 Usinf socket.io 我想在数据库表中插入新数据时刷新我的图表。

即在表中添加数据的服务器代码。在数据库中添加数据后,我向客户端发送一条消息以更新我的图表。

app.post('/usersacces/add', function (req,res) {
    var response = [];

    if (typeof req.body.alias!== 'undefined' &&typeof req.body.nom!== 'undefined'   ) {
        var alias = req.body.alias, nom = req.body.nom;

        connection.query('INSERT INTO administration_users_niveaux_acces (alias, nom) VALUES (?, ?)',
            [alias, nom],
            function(err, result) {
                if (!err){

                    if (result.affectedRows != 0) {
                        response.push({'result' : 'success'});

                    } else {
                        response.push({'msg' : 'No Result Found'});
                    }
          // When a client connects, we note it in the console
          io.sockets.on('connection', function (socket) {
              socket.emit('message', 'You are connected!');
              console.log('message '+ 'You are connected!');
          });
                    res.setHeader('Content-Type', 'application/json');
                    res.status(200).send(JSON.stringify(response));
                } else {
                    res.status(400).send(err);
                }
            });

    } else {
        response.push({'result' : 'error', 'msg' : 'Please fill required details'});
        res.setHeader('Content-Type', 'application/json');
        res.status(200).send(JSON.stringify(response));
    }
 });

那是客户端,应该接收消息并更新图表。但是当单击按钮在数据库中添加新数据时,图表不会更新,并且发送给服务器的消息不会显示在控制台中。它仅在我加载页面时显示。

socket.on('message', function(message) {
          var databa = [];
          $.ajax({
                  url: '/usersacces'
              })
              .done(function(data) {
                  for (var i = 0, len = data[0].items.length; i < len; i++) {
                      var e1 = data[0].items[i].id;
                      databa.push(e1);
                  }
                  myChart.data.datasets[0].data = databa;
                          myChart.update();
              }).always(function() {
                  console.log(1);

              });

        console.log('The server has a message for you: ' + message);
    });

【问题讨论】:

  • 所以你做console.log时收不到消息('服务器有消息给你:'消息); ??我没有看到您在哪里向客户端发送带有新数据的消息?

标签: javascript node.js web-services socket.io


【解决方案1】:

问题是您的套接字仅在用户连接时发出消息,但从不创建任何其他“事件”供套接字侦听。因此,您的代码逻辑有点混乱。您的前端在收到消息时会发出 http 请求。但是,当后端接收到 http 请求时,会创建套接字服务器。你的问题是逻辑造成的。

当我在 node.js 中使用 socket.io 时,我总是在这样定义我的服务器时声明套接字:

io.on("connection", (socket) => {
        console.log("A user connected");
        // Trigger an event when receive a message
        socket.on("event1", (data, callback) => {
        });

        // Emit a message when server did something
        // I used amqp to communicate within backend server
        // You can simply pass socket to wherever you want to emit the message
        amqpReceiver("event2" + socket.id, (msg) => {
            socket.emit("event2", msg);
        });

        // This is an emit example for you
        // Having a service claimed here makes your code hard to read
        // You can find a lot of ways to pass your socket
        app.post("/usersacces/add", function (req, res) {
            // Emit message during service process
            socket.emit("event3", msg);
        });
    });

然后在前端我像这样监听事件:

socket.on("event3", (message) => {
    console.log(message);
})

// Make request outside of socket.on callback
 $.ajax({ url: "/usersacces" })
  .done(function(data) {})

我的代码逻辑是:

先建立socket连接,保持前后端监听。然后在需要时触发发射事件。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多