如何使用 express app 和 socket io 制作实时数据库

how to make a realtime database with express app and socket io

我正在使用 express create app 创建一个应用程序,该应用程序旨在 运行 在 plesk 托管中,我也已经配置它所以可以 运行 在 plesk 托管中按照以下示例官方plesk node express project(没问题)。在这个应用程序中有一些重要的功能:
- /routes/api.js rest API,使用post方法从客户端获取数据,然后将其保存到数据库中。
- /routes/index.js 仪表板,显示从数据库到仪表板视图的数据。
- 实时更新,这是需要rest API 和dashboard 之间关系的功能。因此,当客户端从 android 客户端发送数据时,它会被 restAPI 捕获并保存,仪表板也会更新。

我曾经使用过像 socket.io 这样的包来测试一个简单的聊天应用程序,但不知道如何在最近的项目中实现它。

到目前为止,我只是从这个论坛寻找解决方案,但没有找到与我的问题相关的任何答案。

注:
我正在使用 mysql 数据库。

更新:

这是我从客户端接收数据的代码 /routes/api.js:

const conn      = require('../connection');
const express   = require('express');
const router    = express.Router();
//here is initiate socket.io, ok i know, but then for next i dont know

router.get('/', (req, res, next) => {
    res.send("test get page");
})

router.post('/', (req, res, next) => {
    var token       = req.body.token;
    var nmea        = req.body.nmea;
    var datetime    = req.body.datetime;

    conn.query("SELECT token FROM token WHERE token='" + token + "'", function(err, res){
        if(err)
        {
            console.error("ERROR: " + err);
        }
        else
        {
            result = res[0];
            if(result  != undefined)
            {
                //i think there's must be any code from socket.io around here?
                conn.query(" INSERT INTO nmea_data(nmea, datetime) VALUES ('" + nmea + "', '" + datetime + "')", function(err, res, fields)
                {
                    if(err)
                    {
                        console.error("ERROR: " + err);
                    }
                    else
                    {
                        console.info('data entered');
                    }
                });
            }
            else
            {
                console.error("token invalid");
            }
        }
    });
    res.status(200).json({
        message: "success",
    })
})

module.exports = router;

以及我如何从数据库中获取数据 /routes/index.js:

var express = require('express');
var router  = express.Router();
var conn    = require('../connection');

/* GET home page. */
router.get('/', function(req, response, next) {
  if(!req.session.admin)
  {
    response.redirect('/login');
  }
  else
  {
    var nmealist = [];
    //also around here.. like io.emit but i'm not sure
    conn.query("SELECT * FROM nmea_data", (err, rows, fields) => {
      if(err)
      {
        console.error(err);
      }
      else
      {
        for(i = 0; i < rows.length; i++)
        {
          var nmeadata = {
            'nmea' : rows[i].nmea,
            'datetime': rows[i].datetime
          }
          nmealist.push(nmeadata);
        }
        response.render('index', {"nmeaList": nmealist});
      }
    })
  }
});

module.exports = router;

请朋友们帮帮我:)

你的做法是错误的。您想要使用 socket.io 从 android 客户端捕获数据,但您为此使用了路由。这没有意义。删除路由并添加如下内容:

io.on("connection", socket => {
    socket.on("postWhatever", payload => {
        // Do database stuff
    })
})

至于更新时从数据库中获取数据。我不确定 MySQL 是否可以做到这一点。但我知道 PostgreSQL 具有 Notify/Listen.

等功能

如果您有什么不明白的地方或者我没有回答您的问题,请在评论中指出。

编辑:似乎 MySQL 没有 real-time 功能,您必须不断 ping 数据库以更新您的用户界面。 Source