我是Node.js的新手,正在尝试将实时数据显示到网页上。我要做的是首先通过URL插入MySQL数据库。这是URL [http://localhost:4000/api/motor_details?deviceId=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,但显示未定义
答案 0 :(得分:0)
因为您正在使用参数[http://localhost:4000/api/motor_details?deviceId=145&a=sdfa3&b=us&c=uds]的查询字符串,而不是基于路由的参数[http://localhost:4000/api/motor_details/145/sdfa3/us/uds],所以应使用req.query代替req.params或req.route。
在Express 4+中,您将要使用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;
});
});