前面介绍了如何创建MQTT,以及MQTT数据如何入库mysql,接下来继续介绍如何创建数据库接口api为后续如何在web上展示数据做准备。写这篇文章不仅为了方便小白,同时也为了记录过程,方便日后忘记了查找。
废话不多说,大神继续绕过。
我们已经将数据库入库了,如果需要将数据拿出来,再放到web中展示出来,这需要创建一个web服务器,然后在服务器上创建数据接口api。经过不断摸索,我发现Node.js特别适合没有基础的小白。Node.js可以快速搭建服务器和前端,因此,我们此篇文章就建立在Node环境下。
一、安装Node
这里我们采用安装源来安装,如果使用apt来安装,可能不会安装到我们想要的版本。
根据Node.js官方网站,目前长期稳定版为:Latest LTS Version: 20.10.0 (includes npm 10.2.3),
因此,采用PPA安装方式,命令如下:
更新ubnutu
sudo apt update
sudo apt upgrade
获取nodejs安装源文件,安装源来自nodesource,
curl -sL https://deb.nodesource.com/setup_20.x -o nodesource_setup.sh
运行安装脚本
sudo bash nodesource_setup.sh
运行正常如图
执行安装命令(-y的意思是顺便安装依赖项):
sudo apt install nodejs -y
安装成功查看版本
node -v
安装成功版本如图
此方法会附带安装npm 10.2.3版本,输入
npm -v
查看npm是否安装成功,安装成功如下:
如果没有安装,安装指令如下:
sudo apt install npm
安装cnpm:
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm是什么?请看以下资料查阅:
众所周知npm
(即 node package manager )是Node
的包管理工具,能解决NodeJS代码部署上的很多问题。可是cnpm又是什么呢?
cnpm的
官方介绍是:cnpm是一个完整 npmjs.org
镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。既然都一样,那么cnpm
为什么要出现呢?
由于npmjs.org
的服务器在国外(即在“墙”外),国(墙)内开发者做项目的时候,很多“包”的下载速度极慢,在这种环境下阿里巴巴为了众多开发者的便捷便挺身而出推出了淘宝镜像(即cnpm),它把npm
官方的“包”全部搬到国内,供广大开发者使用。
安装成功,如下:
6.为了方便管理node程序,我们还需安装一个pm2管理器。可以方便快速管理node程序开机自启,快速运行,查看状态等。
cnpm install pm2 -g
查看pm2安装情况:
pm2 list
安装成功如下:
#安装过程如果遇到以下错误,
Error: Cannot find module 'semver'
解决方法如下:
重新卸载Node,卸载完成,重新安装一次。
sudo apt remove --purge npm
sudo apt remove --purge nodejs
sudo apt remove --purge nodejs-legacy
sudo apt autoremove
rm -r /usr/local/bin/npm
rm -r /usr/local/lib/node-models
find / -name npm
rm -r /tmp/npm*
安装过程如果出现如下错误,
rollbackFailedOptional
解决如下:
修改npm的资源镜像链接
npm config set registry http://registry.npm.taobao.org
Node安装完毕
二、安装 Nginx
执行安装
sudo apt update
sudo apt install nginx -y
查看安装版本
nginx -v
如下:
启动并启用 Nginx 服务
sudo systemctl start nginx
sudo systemctl enable nginx
验证 Nginx 服务状态
sudo systemctl status nginx
sudo systemctl is-active nginx
如下:
放行端口80和443端口
如果您的 Ubuntu 系统上启用并配置了防火墙,则执行以下 ufw 命令以允许 80 和 443 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
如下
使用下面的命令验证规则
sudo ufw status numbered
若返回如下:
则说明正常,如返回如下:
则防火墙关闭,如果您需要启用防护墙输入如下指令:
sudo ufw enable
警告:如果您是ssh登录,开启后,若22端口未放行,则您无法再通过ssh登录。
完成了上述更改后,让我们访问 Nginx 欢迎页面,输入查看ip地址:
ip a
IP地址为172.18.21.59
在浏览器中输入:http://172.18.21.59
Nginx安装完毕。
三、创建api接口
在根目录下创建www/wwwroot/nodeServer文件夹,在nodeServer文件夹下创建api.js文件。
通过如下指令创建文件夹:
cd
mkdir -p /www/wwwroot/nodeServer
cd /www/wwwroot/nodeServer
touch api.js
接着打开文件,按i进入编辑模式,输入完,先按esc退出编辑模式。按shift+z+z保存,按ctrl+z退出。
vi api.js
输入如下内容,并保存:
/* api.js */
const express = require('express')
const app = express()
const mysql = require('mysql')
const cors = require('cors')
const bodyParser = require('body-parser')
/* 中间件处理跨域 */
app.use(cors())
/* 连接mysql数据库 */
const db = mysql.createConnection({
host: 'localhost',
port: '3306',
user: 'root',
password: 'wen123',
database: 'mqtt_data'
})
db.connect((err) => {
if (err) {
console.log(err)
} else {
console.log('success')
}
})
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
/* 监听5354端口 */
app.listen(5354, function() {
console.log('——————————服务已启动——————————')
})
// 查看服务启动没有,返回的html元素
app.get('/', function(req, res) {
res.send('<p style="color:red">服务已启动</p>')
})
/* 创建api */
app.get('/getByDate', function(req, res) {
let date1 = req.query.date1
let date2 = req.query.date2
const sql = `SELECT * FROM fluence where (Date >= ${date1}) AND (Date < ${date2})`
db.query(sql,function(err, result) {
if (err) throw err
res.send(result)
})
})
也可以将api.js通过其他工具导入到www/wwwroot/nodeServer目录下,比如MobaXterm的ssh连接。
安装 api.js 依赖 express mysql cors body-parser
cd /www/wwwroot/nodeServer
cnpm install express mysql cors body-parser
安装正常如图:
运行api测试,
node api.js
测试正常如图:
接口启动正常,接下来我们用postman测试:
postman是啥?具体百度吧,外行人也说不清楚。接口采用GET方式,具体细节请研读Node.js、JavaScript、MySql等。
需要注意的是,我们在api.js中创建了接口地址,红色框内是我们自己定义的url标识:
在postman中,我们可以看到,实际的url如下:
http://192.168.1.227:5354/getByDate?date1="2023-12-31 08:00:00"&date2="2024-1-1 08:00:00"
其中,橙色的是ip地址+我们的url标识,? 表示形参传递,也就是设置入口函数定义的变量值,红色部分则是实际赋值。
api中创建的仅是 通过时间变量来筛选数据,若您想要通过其他表的元素来筛选,请再创建一段接口程序段,放在下面,给与不同的url标识,调用不同mysql刷选数据的方式或者增、删、改等方法,即可实现与数据库任意处理。具体操作方式,请参考mysql指令。
以上,我们已经初步创建了一个通过时间筛选的接口程序,但我们不可能每次开机手动运行它,下面就来说一下,我们如何将它设为后台自启,这就用到了我们前面安装的pm2管理器。请往下看。
四、通过pm2开机自启动api.js
1.通过pm2先启动api.js
cd
pm2 start /www/wwwroot/nodeServer/api.js
如下:
2.启动所有要管理的应用程序后,保存到自启列表
pm2 save
如下:
3.生成开机自启动服务
pm2 startup
如下:
4.加载到开机服务
systemctl enable pm2-root
5.重启
reboot
6.等待重启后,通过pm2查看启动情况
pm2 list
如下:
api.js已经自动启动正常。通过postman测试,也是正常的。
如果我们需要修改api.js,则需要手动终止它,可以输入指令:
pm2 stop 0
其中,0是pm2中的程序对应的id号码。处理完后,再通过手动指令启动:
pm2 start 0
postman测试正常。
到此,我们的api接口创建完毕。
五、说明
到这里,我们的后端服务器已经创建完毕,这仅是千千万方法中的其中一个。剩下的就是在前端把数据展示处理,怎么展示,暂时没有精力去研究了。专业的事还是交给专业的人来完成吧。后续,等空下来,我再研究一下前端。
前端需要学习的东西:html、JavaScript、vue等,下面的网站这里用的还是node,万能的node可前也可后。当然也可以用php,看您个人兴趣。
以下是我个人的部分展示:
顺便说一句,要实现外网访问,需要购买域名、购买服务区、做网站实名认证、购买ssl证书(有免费三个月用于测试学习的证书)等。如果只是内网测试,则不需要这么麻烦。感谢各位菜鸟同行。