写在前面

    本文章仅仅涉及到基本的NodeJS语法、Express.JS简单操作数据库和基础的网站api编写。此外,我已经默认了你掌握mysql语法和简单的js代码。并且在实际项目开发过程中很少会使用这种简单的形式去构建,仅仅是作为入门的基础,自己玩玩可以,实际的承载量不太高。

Express 框架使用指南

安装NodeJS与NPM包管理器

首先需要说明的是,Express框架是依托于Nodejs构建而来的,是作为其中的插件而存在的,要想使用插件的话,需要安装NPM包管理器,但是放心,Nodejs里面已经包含了NPM包管理器。打开https://nodejs.org/en/download/以下载你所需要的版本并安装。

安装Mysql与Express.js

请在任意位置创建文件夹并打开终端!

安装Nodejs完成之后,你的终端里就会出现NPM这个全局命令,所有在前端开发和Nodejs后端所需要的插件和框架都需要使用NPM包管理器,相当于Java中的Maven管理器,所以请使用下述命令安装Mysql和Express框架:

1
2
npm install mysql
npm install express

安装命令跑完之后你的文件夹里就会出现node_modulespackage.jsonpackage-lock.json,其中第一个是刚刚下载安装的Mysql数据库插件和Express框架插件存放的文件夹,你可以打开看看其文件结构,剩下的第二和第三是版本管理相关的文件,确定项目所需要插件的具体版本,防止冲突,一般情况下我们可以忽视。

引入插件

安装完成之后就可以开始正式开始编写代码了

在跟node_modules同级的目录下,新建app.js首先引入Mysql和Express:

1
2
3
4
5
// 导入mysql模块
var mysql = require("mysql")

// 导入express模块
var express = require("express")

创建服务器与配置数据库

复制下述代码建立与数据库的连接和创建Express服务器:

1
2
3
4
5
6
7
8
9
10
// 创建服务器
const app = express()

// 通过CreatPool建立与Mysql数据库的链接
const db = mysql.createPool({
host:"数据库地址IP",
user:"数据库用户名",
password:"数据库密码",
database:"数据库名字"
});

配置中间件

配置中间件进行服务端与客户端传送数据的处理

配置中间件样例:

1
2
// 配置中间件
app.use(express.urlencoded({ extended: false }))

上述代码的作用就是处理客户端发送的Http的Post请求中传送到服务器端的数据。不然的话,在接下来的定义POST请求文件的function方法中,想把数据更新到数据库中会显示undefined

配置跨域请求

配置跨域请求样例:

1
2
3
4
5
6
7
8
// 跨域配置
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Methods', '*');
res.header('Content-Type', 'application/json;charset=utf-8');
next();
});

跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。在前后端分离开发的项目中,会出现前端端口和后端端口使用的不能是同一个端口的情况,假如一个域名为aaa.cn的网站,它发起一个资源路径为aaa.cn/getBookInfo的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为aaa.cn:8080/getBookInfo(这时候端口号是8080)的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制,也就是阻止访问。

配置GET与POST方法

到了这一步,就要到Express操作数据库与前后端数据互动的阶段了。

GET方法编写样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 获取数据
app.get('/userinfo', (req, res) => {
// 数据库查询
db.query('select * from userinfo', (err, data) => {
if (err) return console.log(err.message); // 连接失败
if (data.length === 0) return console.log('数据为空'); // 数据长度为0 则没有获取到数据
// 否则获取成功,将结果返回给客户端res.send
res.send({
status: 0,
msg: '数据获取成功',
data
})
})
});

如果你英语比较好的话,你应该对上述代码比较熟悉:

get表示现在是GET方法,后面紧跟着get后括号内的userinfo就是辨别具体请求,例如前端访问http://你的IP+端口/userinfo,这时候服务器就会监听到userinfo,而这个方法就会被执行。

db就是Mysql的一个连接,详情请看配置数据库连接,query就是查询的意思,整个方法意思就是执行查询数据库,并将查询结果返回。同理,紧跟着括号后面的,就是被执行的SQL语句。而查询结果,就是跟在SQL语句后面的('select * from userinfo', (err, data)中的data

req是request的简写,意思就是从前端传回来的要求数据,具体很复杂,可以在里面配置一个参数,res是respond的简写,意思就是发送回前端的数据,其中就可以添加db.query方法运行后查询的数据。

这个就很好理解了,就是在发送回前端的数据中添加内容。

POST方法编写样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 注册
app.post('/register',(req,res) => {
//DataProcess
let { account, password } = req.body
let userinfo = {account,password}
//SQL
var sql = "insert into userinfo (userid,passwd) values (?,?)"
//数据库插入
db.query(sql,[userinfo.account, userinfo.password],(err, data) => {
if (err) return console.log(err.message); // 连接失败
if (data.length === 0) return console.log('数据为空'); // 数据长度为0 则没有获取到数据
// 否则获取成功,将结果返回给客户端res.send
res.send({
status: 0,
msg: '账户注册成功',
data
})
})
});

和GET样例基本差不多的代码:

post表示现在是POST方法,后面紧跟着post后括号内的register就是辨别具体请求,例如前端访问http://你的IP+端口/register,这时候服务器就会监听到register,而这个方法就会被执行。

req.body实际上就是前端传送到后端的数据,我这两行这么写是通过结构赋值的方法把数据从着个body中解析出来,方便更新到数据库。

这个没啥可说的,就是SQL语句,但是需要注意的是,在我的SQL语句数据括号中,我写的是“?”,在接下来的查询方法中“?”会被后面的数据给替换掉,实现SQL语句的完整拼写。

编辑app入口配置

上一步完成之后,最后就可以配置你后端app所需要的端口了:

1
2
3
4
// 启动服务器
app.listen(5500,() => {
console.log('后端部署运行中。。。')
});

注意,你写的端口号要确保开放,在VPS的防火墙中记得开放,如果你装了宝塔面板,也请在宝塔面板中的安全选项中开放端口。

启动与部署

启动后端

这时候你就可以打开终端,敲上命令,注意要你编写的app.js文件夹里面:

1
node app.js

当你看到:

1
2
PS C:\Users\xxx\桌面\demo> node app.js
后端部署运行中。。。

说明已经成功启动了。这时候你就可以用浏览器打开http://localhost:你上一步写的端口,我这里是5500/userinfo,如果你有正确配置数据库、数据库里有数据、SQL查询语句拼写正确的话,应该会出现数据。

部署后端

你可以在宝塔面板的网站一栏中看到nodejs项目,你可以将文件上传到你的VPS中配置。

或者你也可以本地安装NodeJS,安装Screen软件screen -S node开启虚拟窗口执行node app.js

最后

    这仅仅是一个最简单的后端api的demo,实际上,真实开发中绝对不像我这么写的简陋,仅仅是作为自己实验和自己搭建一部分自用的功能而搭建的后端。总的来说,国内开发大部分都是Go和Java一系,Node相对涉猎较少,但是其中的Express框架相对于主流后端来说轻便,迅速,但是多线程缺乏,本文章也仅仅是稍稍解释,实际上学完了Node、Express框架仍然是不被国内主流认可的。