之前做了一个商城的 demo,当时是用的别人接口,用的人比较多,经常就挂了,我就寻思自己开发一下这个接口自用,

主要技术栈很简单,就是 node+express 就行了,当然你还需要会一点 mysql!

爬取数据

爬取原接口数据:Node 爬取数据到数据库练习

代码都在这里了。我之前就爬取下来了。放进数据库。

编写接口代码

这个也没什么好说的,就是运用动态路由,示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
var express = require('express')
var router = express.Router()
let sqlQuery = require('./mysql')

router.get('/', async function (req, res) {
let iid = req.query.iid
let sqlStr = `select data from detail where iid = ?`
let result = await sqlQuery(sqlStr, iid)
result = JSON.parse(result[0].data)
res.send(result)
})
module.exports = router

这里我封装了一下数据库查询语句,封装的 sqlquery 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
let mysql = require('mysql')

let sqlOptions = {
host: 'localhost',
port: '3306',
user: 'root',
password: '123456',
database: 'mall',
}
// 创建连接
let con = mysql.createConnection(sqlOptions)
con.connect((err) => {
if (err) {
console.log('错误信息:' + err)
} else {
console.log('数据库连接成功')
}
})

function sqlQuery(strSql, arr) {
return new Promise((resolve, reject) => {
con.query(strSql, arr, (err, results) => {
if (err) {
reject('错误信息:' + err)
} else {
resolve(results)
}
})
})
}
module.exports = sqlQuery

在云服务器上部署 node 项目

我使用的是阿里云的 ECS 云服务器+宝塔面板。

首先将所有文件上传到服务器中:我上传的位置:/www/wwwroot/mallAPI

image-20200505160142160

然后我们在软件商店安装一个 pm2:

image-20200505160238425

打开它,分别填入根目录和启动文件,添加项目,并启动。

image-20200505160349822

然后点击映射,填入你的域名,添加反向代理:

image-20200505160523376

这样就部署好了。

踩坑记录

从数据库中取出 json 数据

在爬取数据的时候,我直接把 JSON 数据放进了 data 字段中,在取出的时候,我们实际得到的是这样一个对象:

47e572d6e2ca9933e1de7ea75d72039

所以我们需要对这个数据简单处理:

1
2
3
4
let sqlStr = 'select data from home_multidata'
let result = await sqlQuery(sqlStr)
result = JSON.parse(result[0].data)
res.send(result)

如果不处理,我们是得不到想要的 JSON 数据的,直接给你返回的是这样一个鬼东西:

node 项目需要安装依赖

明明上传了项目,但是在 pm2 管理器部署,总是不成功,可能是依赖问题。我上传的时候没有上传 node-modules 文件夹,因为这个文件实在是又臭又长。

我们直接使用 Xshell 或者宝塔终端或者其他什么都可以,连接到服务器,切换到项目目录,安装依赖就好,这里依然还是推荐淘宝镜像:

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

然后:

1
cnpm install

开发完成

到这里我们的 API 接口就开发完成了。看看效果:

image-20200505161721715

image-20200505161700833

代码地址

api 代码地址:mallAPI