这是我参与「第五届青训营 」伴学笔记创作活动的第 八 天
Express
Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。Express 基于Node.js 内置的 http 模块进一步封装,极大地提高了创建服务器的开发效率。使用 Express 框架可以让你快速地搭建一个完整的网站。你可以前往 Express 中文官网 学习如何使用 Express。
Express 安装
在项目目录中,你可以在终端使用以下命令通过 npm 或 yarn 安装 Express
npm install express --save
yarn add express
基本服务器搭建
安装 Express 后,由于其是第三方的包,我们需要通过require()方法导入 Express。通过调用 Express 中的 listen() 方法,指定服务器端口,设置回调函数,我们就能创建最基本的服务器。你可以在终端通过node + 文件路径来启动服务器服务。
//导入express
const express = require('express')
//创建web服务器
const app = express()
//启动web服务器
app.listen(80,() => {
console.log('express server running at http://127.0.0.1')
})
路由
简单路由
在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express 中的路由分3部分组成,分别是请求的类型、请求的 URL 地址、处理函数。每当一个请求到达服务器,都会通过路由的匹配,只有请求的类型和请求的 URL 地址匹配成功,才会调用对应的处理函数进行处理。以下便是用于监听 Get 与 Post 请求的两个简单路由。
//监听客户端的GET和POST请求,并向客户端相应具体的内容
app.get('/user',(req,res) => {
console.log('Get 请求成功')
})
app.post('/user',(req,res) => {
console.log('Post 请求成功')
})
模块化路由
为了增强代码的可读性以及可维护性,更好地管理项目代码,我们通常将路由抽离至单独的文件,进行模块化处理。建立模块文件之后,我们需要导入 Express 并通过其提供的Router()方法创建路由对象,通过将路由挂载到 router 对象上,我们可以通过module.exports方法向外暴露对象内容,使得其他文件可以访问本文件内容。
//路由模块
const express =require('express')
//创建路由对象
const router = express.Router()
//挂载具体的路由
router.ger('/user/list',(req,res)=>{
res.send('Get user list.')
})
router.post('/user/add',(req,res)=>{
res.send('Add new user.')
})
//向外导出路由对象
module.exports = router
在服务器所在文件,我们依然通过 require方法引入路由模块,并通过 app.use()注册路由模块。
//导入路由模块
const router = require('./router.js')
//注册路由模块
app.use(router)
中间件
中间件即在业务的流程中,负责进行中间过程的处理的环节,当请求进入服务器之后,会经由中间件的处理,完成请求所需的要求,之后再经由路由响应到客户端。中间件通常有三个参数,分别是 (req, res, next)。中间件有时不仅仅有一个,同时多个中间件时,当一个中间件处理完成后,将调用 next()方法将数据流推送到下一个中间件或路由。
//定义一个最简单的中间件函数
const zjj = function(req,res,next){
console.log('这是最简单的中间件函数')
//把流转关系转交给下一个中间件或路由
next()
}
全局中间件
全局中间件即在全局生效的中间件,当服务器接收到客户端发送的任何请求,都会触发全局中间件对其进行处理。通过调用 app.use(中间件函数)即可注册一个全局生效的中间件。
//将 zjj 注册为全局生效的中间件
app.use(zjj)
局部中间件
局部生效的中间件只在其定义的范围内生效,其不经由 app.use()注册。如当中间件 zjj 在以下的路由中被注册,则 zjj 只在这一个路由中生效。
//将 zjj 注册为局部生效的中间件
app.get('/',zjj,(req,res) => {
res.send('Hello')
})
编写接口
编写 Get&Post 接口
与我们上面编写的简单的 Get 与 Post 路由的方法相同,但是我们在接收到请求之后需要对请求的内容做出处理以及对客户端进行基本的响应。
app.get('/get',(req,res) => {
//通过 req.query 获取客户端通过查询字符串,发送到服务器的数据
const query = req.query
//调用 res.send() 方法,向客户端响应处理的结果
res.send({
status:0,// 0 表示处理成功,1 表示处理失败
msg: 'GET 请求成功!',// 状态的描述
data: query // 需要响应给客户端的数据
})
})
app.post('/post',(req,res) => {
const body = req.body
res.send({
status: 0,
msg: 'POST 请求成功',
data: body
})
})
跨域
当我们编写完接口之后,我们发现从客户端发送请求时会遇到跨域问题,浏览器控制台会进行报错,并且我们无法获得从服务端发送过来的数据。
我们可以通过多种方式解决跨域问题,一是在客户端配置反向代理,二是在服务端配置跨域许可。我们可以通过安装并引用 cors这个第三方中间件来解决跨域问题。
//通过终端安装 cors
npm i cors
//在文件中引入 cors
const cors = require('cors')
//注册 cors
app.use(cors())
数据库
MySQL 安装
数据库的安装方式有多种,你可以参考 MySQL官网 的官方文档来安装 MySQL,或通过其他第三方集成环境来安装并使用 MySQL 数据库。
mysql 模块
我们可以通过安装第三方模块 mysql 来操作 MySQL 数据库。
npm i mysql
通过配置 mysql 模块,我们可以连接并操作 MySQL 数据库。
//引入 mysql 模块
const mysql = require('mysql')
//与 MySQL 数据库建立连接
const db = mysql.createPool({
host: '127.0.0.1', // 数据库的IP地址
user: 'root', // 登录数据库的账号
password: 'admin123', // 登录数据库的密码
database: 'my_db_01' // 指定要操作哪个数据库
})
与 MySQL 数据库建立连接后,我们可以通过 SQL 语句来操控数据库中的表格与数据。
//查询 users 表中所有的数据
const sqlStr = 'select * from users'
db.query(sqlStr,(err,results) => {
// 查询数据失败
if(err) return console.log(err.message)
// 查询数据成功
console.log(results)
})