如何使用 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
我正在使用 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