Express后台框架学习笔记
前言
若文章有误,欢迎读者留言反馈一篇文章学会express后台框架
express介绍
链接地址:https://www.expressjs.com.cn
Express 是基于 Node.js 平台,快速、开放、极简
的 Web 开发框架。搭建web服务器
Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。
使用Express开发框架可以非常方便、快速的创建Web网站的服务器或API接口的服务器
基本流程
创建项目文件夹
安装一个nodemon工具,代码改变之后自动重启
1 | # 全局安装【全局安装一次后就不需要重复安装了】 |
初始化生成包管理文件package.json
1 | npm init -y[不询问] |
安装express生产包
1 | npm i -S express |
在项目文件夹下创建一个js文件
使用express
- 导入express模块
const express = require('express')
- 创建web实例
const app = express()
- 监听请求
- 用户通过get方式访问根
/
输出hello world
app.get('/', (req, res) => { res.send('hello world') })
- 用户通过post访问
/post
输出hello post
- app.post(‘/post’, (req, res) => { res.send(‘hello post’) })
- 用户通过get方式访问根
- 启动后台服务
app.listen(8080, () => { console.log('server is running at http://127.0.0.1:8080') })
请求类型
- GET: 查询请求类型
- 主要用于获取数据,一般用于首屏,展示首页,通过get方式,更快获取到数据进行渲染。
- POST:新增请求类型
- 发送更多的数据给后端,不像get是在地址栏,数据放到body中以form或者json【raw】格式向后台发送
- PUT:修改请求类型
- 修改是要条件的,修改条件的传递是通过地址栏传递的(restful规范)
- 修改的数据主体是通过请求体传递的(请求体发送方式与post一致)
- PUT也是由POST封装的
- DELETE:删除请求类型
- 删除是要条件的,删除条件的传递是通过地址栏传递的(restful规范)
- PUT也是由POST封装的
GET方式传参如何获取
通过
req.query
对象,可以访问到客户端通过查询字符串的形式发送到服务器的参数:
1 | // http://localhost:8080/?id=12&name=aa |
动态参数传参
Express也支持类似于Vue中
动态路由
的形式传递参数,传递的参数通过 req.params 对象可以访问到:
1 | // http://localhost:8080/123 |
==通过?可以指定可传可不传,与正则表达式?一样==
静态资源托管
express提供了一个非常好用的方法,叫做
express.static()
,通过此方法,可以非常方便地创建一个静态web资源服务器:
1 | app.use(express.static('assets')) |
express还支持给静态资源文件创建一个虚拟的文件前缀(实际上文件系统中并不存在),可以使用 express.static
函数指定一个虚拟的静态目录,就像下面这样:
前缀的使用意义:
- 可以迷惑别人,一定程度上阻止别人猜测我们服务器的目录结构
- 可以帮助我们更好的组织和管理静态资源
1 | app.use('/static', express.static('assets')) |
现在你可以使用 /static
作为前缀来加载 assets
文件夹下的文件了:
1 | http://localhost:8080/static/a.jpg |
==使用app.use()
方法一般写在具体的路由监听之前。==
静态资源托管eg:
1 | /* |
路由模块化
把路由拆分成多个js文件,每个js文件就是一个模块,【整个模块负责这个页面的所有请求】路由模块化处理主要分以下几个步骤:
- 创建一个目录,一般是router目录,再创建一个js文件
- 该文件即路由模块化文件
- 引入express模块,再通过express.Router方法创建路由模块对象router
- const express = require(‘express)
- const router = express.Router()
- 使用路由对象完成路由规则对应的业务编写
- router.get(‘/gethome’, (req, res) => { res.send(‘hello gethome’) })
- router.post(‘/posthome’, (req, res) => { res.send(‘hello posthome’) })
- 使用模块化导出
- module.exports = router
- 或者exports = router
- 在你的文件需要使用的地方引入路由模块化文件
- const homeData = require(路径)
- 注册使用[使用的该文件也要引入express,创建实例,最后启动监听端口]
- app.use(homeData)
路由模块化操作eg:
1 | /* |
中间件,post传递参数如何取值
==使用内置中间件 express.urlencoded({ extended: false })
接收post表单数据的键值对【参数队列】==
==使用内置中间件 express.json()
接收json格式提交的数据 ==
两个可以同时使用,应对不同格式数据来取值,数据放在请求体中【body】
在接收完数据后,会将数据的对象形式挂载到req
请求对象的body
属性上
中间件操作eg:
1 | // 使用内置中间件 express.urlencoded({extended:false}) 接收form数据的 |
第三方中间件
使用第三方中间件来获取表单的数据 body-parser
- 安装 npm i -S body-parser
- 使用第三方中间件
const body = require('body-parser')
- 接口处获取前端发送过来的数据
req.body
第三方中间件操作eg:
1 | // 使用第三方中间件来获取表单的数据 body-parser |
404处理
404错误中间件也要求在所有的正常请求路由的后面去声明使用,不要放在路由的前面,否则会导致后面的路由都是404错误。
1 | // 假设定义这个路由,但是实际请求的时候请求了/12345,这个时候就会404 |
cookie后台获取
HTTP是一个无状态协议,客户端每次发出请求时候,下一次请求得不到上一次请求的数据,我们如何将上一次请求和下一次请求的数据关联起来呢?如用户登录成功后,跳转到其他页面时候,其他的页面是如何知道该用户已经登录了呢?此时就可以使用到cookie中的值来判断用户是否登录,cookie可以保持用户数据。
cookie简介:cookie它是一个由浏览器(存储cookie)和服务器(产生cookie)共同协作实现的(cookie是存储于浏览器中)。cookie分为如下几步实现:
- 服务器端向客户端发送cookie并指定cookie的过期时间。
- 浏览器将cookie保存起来。
- 之后每次请求都会将cookie发向服务器端,在cookie没有过期时间内服务器都可以得到cookie中的值。
express中操作的cookie使用cookie-parser模块。
cookie-parser模块(也是中间件),所以其也会去操作req,res对象;
- 设置cookie是通过
res.cookie(name,value,[选项])
- 读cookie的时候需要通过
req.cookies
对象来获取。
安装cookie-parser模块1
npm i -S cookie-parser
cookie操作eg:
1 | /* |
session
cookie操作很方便,但是使用cookie安全性不高,cookie中的所有数据存储在客户端浏览器中,数据很容易被伪造;所以一些重要的数据就不能放在cookie当中了,并且cookie还有一个缺点就是不能存放太多的数据,一般浏览大约在4k左右,为了解决这些问题,session就产生了,session中的数据保留在服务端的。
数据放到cookie中是不安全的,我们可以在cookie中存放一个sessionId值,该sessionId会与服务器端之间会产生映射关系,如果sessionId被篡改的话,那么它就不会与服务器端数据之间产生映射,因此安全性就更好,并且session的有效期一般比较短,一般都是设置是20分钟左右,如果在20分钟内客户端与服务端没有产生交互,服务端就会将数据删除。
express操作session使用cookie-session模块
cookie-session包对session设置与获取都是基于req请求对象
安装:npm i -S cookie-session
session操作eg:
1 | const express = require("express"); |