如何使用node.js、socket.io和mysql显示实时数据?

qxsslcnc  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(403)

我是node.js的新手,正在尝试向网页显示实时数据。我要做的是首先通过一个url插入mysql数据库。这是url[http://localhost:4000/api/电机详细信息?设备ID=145&a=sdfa3&b=us&c=uds]。下面的代码能够插入到数据库中。数据只在刷新页面时可见,但我希望看到插入到我的网页中的数据而不刷新它。
这是我的index.js(主文件)

<pre>
var express = require('express');
    var socket = require('socket.io');
    var mysql = require('mysql');
    var http = require("http");
    var app = express();
    var server = app.listen(4000,function(){
        console.log('Listening 4000');
    });
    var io = socket(server);
    app.use(express.static('public'));

    var connectSql = mysql.createConnection({
        host: "localhost",
        user: "root",
        password: "root",
        database: "grid_component",
        socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock'
    });
    connectSql.connect();
    app.get('/api/motor_details', function(req, res) {
        var device_id = req.param('deviceId');
        var a = req.param('a');
        var b = req.param('b');  
        var c = req.param('c');  
        var entries = {
            device_id: device_id,
            a: a,
            b: b,
            c: c,
            date: '2018-06-27'
        }
        var query = connectSql.query('insert into entries set ?', entries,function (err, result) {
            if(err){
                console.error(err);
                return;
            }  
        })
    });
    io.on('connection',function(socket){
        connectSql.query('SELECT * FROM entries',function(err,rows){
            if(err) throw err;
            socket.emit('showrows', rows);
        });
    });
</pre>

<pre>
var socket = io.connect('http://localhost:4000');
 socket.emit('showrows');
 socket.on('showrows', function(rows) {
     var html='';
     for(var i=0; i<rows.length; i++){
         html += rows[i].device_id + ' ' + rows[i].a + '<br>';
     }  
     document.getElementById("display").innerHTML = html;
 }); 
</pre>

[![Error Screenshot][1]][1]

我甚至尝试用req.params、req.body或req.query更改req.param,但结果显示未定义

luaexgnf

luaexgnf1#

因为您正在使用查询字符串作为参数[http://localhost:4000/api/motor\u details?deviceid=145&a=sdfa3&b=us&c=uds]而不是基于路由的参数[http://localhost:4000/api/motor\u details/145/sdfa3/us/uds],您应该使用req.query而不是req.params或req.route。
在express4+中,您需要使用req.query.name-of-parameter而不是req.query('deviceid')https://expressjs.com/en/api.html#req.query
将数据放入数据库后,您需要通过socket.io将事件从节点服务器发送到客户端网页,以通知它检索数据。

var express = require('express');
var socket = require('socket.io');
var mysql = require('mysql');
var http = require("http");
var app = express();
var server = app.listen(4000,function(){
    console.log('Listening 4000');
});
var io = socket(server);
app.use(express.static('public'));

var connectSql = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "root",
    database: "grid_component",
    socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock'
});
connectSql.connect();
app.get('/api/motor_details', function(req, res) {
    var device_id = req.query.deviceId;
    var a = req.query.a;
    var b = req.query.b;  
    var c = req.query.c;  
    var entries = {
        device_id: device_id,
        a: a,
        b: b,
        c: c,
        date: '2018-06-27'
    }
    var query = connectSql.query('insert into entries set ?', entries,function (err, result) {
        if(err){
            console.error(err);
            return;
        }  
    })
    //emit using socket io, you can name it whatever you want
    socket.emit('sendingMessage');
});

//set up route to retrieve motor details
app.get('/api/get-motor-details', function(req, res) {

    var query = connectSql.query('SELECT * FROM entries',function(err,rows){
        if(err) throw err;
        res.end(JSON.stringify(rows);
    });
});

//all this is doing is telling the server to retrieve the data upon every socket connection, which is not the behavior you wanted
/*io.on('connection',function(socket){
    connectSql.query('SELECT * FROM entries',function(err,rows){
        if(err) throw err;
        socket.emit('showrows', rows);
    });
});*/

//-----------------CLIENT--------------------------
/*on your client webpage you will need to set up socket.io and a listener for 
the sendingMessage event*/
var socket = io('http://localhost:4000');
socket.on('sendingMessage', () => {
    //use whatever library you want for ajax calls, this is just an example
    fetch('http://localhost:4000/api/get-motor-details')
    .then((response) => {
        var html='';
        for(var i=0; i<response.length; i++){
            html += response[i].device_id + ' ' + response[i].a + '<br>';
        }  
        document.getElementById("display").innerHTML = html;
    });
});

相关问题