昨天完成了將STM32采集到的溫濕度數(shù)據(jù)傳到服務(wù)端苛聘,存入Mysql數(shù)據(jù)庫(kù)的操作伐谈。今天做的是通過(guò)express連接數(shù)據(jù)庫(kù)够掠,提供接口民褂,讓前端頁(yè)面通過(guò)fetch獲取數(shù)據(jù)。其中遇到了跨域問(wèn)題疯潭,在express中解決了赊堪。
代碼地址:https://github.com/klren0312/stm32_wifi
2017.3.21
搭建簡(jiǎn)易的物聯(lián)網(wǎng)服務(wù)端和客戶端目錄
Express服務(wù)端與前端獲取
1.Express服務(wù)端代碼
1)連接數(shù)據(jù)庫(kù)(前面已經(jīng)有介紹了)
var mysql = require('mysql');
//數(shù)據(jù)庫(kù)配置
var conn = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'nodemysql',
port:3306
});
//連接數(shù)據(jù)庫(kù)
conn.connect();
2)Express跨域解決
解決了前端的
已攔截跨源請(qǐng)求:同源策略禁止讀取位于 http://127.0.0.1:3000/mysql 的遠(yuǎn)程資源。(原因:CORS 頭缺少 'Access-Control-Allow-Origin')竖哩。
錯(cuò)誤
//設(shè)置所有路由無(wú)限制訪問(wèn)哭廉,不需要跨域
app.all('*',function(req,res,next){
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Headers","X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",'3.2.1');
res.header("Content-Type","application/json;charset=utf-8");
next();
})
3)路由配置(提供接口)
兩個(gè)接口,分別是溫度和濕度數(shù)據(jù)相叁。提供最新的五個(gè)數(shù)據(jù)
app.get('/tem',function(req,res){
var tem = [];
conn.query('SELECT * FROM env',function(err,rows,fields){
var i = rows.length;
var i = rows.length;
var j =i-5;
var c= 0;
while(j < i ){
tem[c] = rows[j].tem;
c++;
j++;
}
res.send(JSON.stringify(tem));
})
})
//濕度
app.get('/hum',function(req,res) {
var hum = [];
conn.query('SELECT * FROM env',function(err,rows,fields){
var i = rows.length;
var j =i-5;
var c= 0;
while(j<i){
hum[c] = rows[j].hum;
c++;
j++;
}
res.send(JSON.stringify(hum));
})
});
4)express服務(wù)器配置
設(shè)置端口為3000
//端口:3000
var server = app.listen(3000,function(){
var host = server.address().address;
var port = server.address().port;
console.log(host + " " + port);
})
2.前端代碼
使用fetch取代ajax(fetch與XMLHttpRequest(XHR)類(lèi)似遵绰,fetch()方法允許你發(fā)出AJAX請(qǐng)求。區(qū)別在于Fetch API使用Promise增淹,因此是一種簡(jiǎn)潔明了的API椿访,比XMLHttpRequest更加簡(jiǎn)單易用。)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsonptest</title>
</head>
<body>
<script>
function status(response){
if(response.status>=200 && response.status<300){
return Promise.resolve(response);
}
else{
return Promise.reject(new Error(response.statusText));
}
}
function json(response){
return response.json();
}
//設(shè)置接口地址
fetch("http://127.0.0.1:3000/tem")
.then(status)
.then(json)
.then(function(data){
console.log("請(qǐng)求成功虑润,JSON解析后的響應(yīng)數(shù)據(jù)為:",data);
})
.catch(function(err){
console.log("Fetch錯(cuò)誤:"+err);
});
</script>
</body>
</html>
3.結(jié)果截圖
1)postman請(qǐng)求溫度截圖
2)postman請(qǐng)求濕度截圖
3)前端fetch獲取到的溫度數(shù)據(jù)截圖
@治電小白菜 20170321