不可抗力/(ㄒoㄒ)/~~ 开始学习node全栈<四>express Web框架

初始Express

基础概念

Express 是基于Node.js平台 快速、开放、极简的Web开发框架

通俗的理解:express 的作用和Node.js 内置的http模块类似,是专门用来创建Web服务器的

Express的本质 就是一个npm 上的第三方包 提供了快速创建web服务器的便捷方法

官网:https://www.expressjs.com.cn/

Express 是基于内置的http模块进一步封装出来的,能够极大的提高开发效率

  • Web网站服务器:专门对外提供Web 网页资源的服务器

  • API接口服务器:专门对外提供API接口的服务器

可以快速创建Web网站的服务器或API接口服务器

安装与创建服务器

安装express npm i express@4.17.1

const express = require('express')
//创建web服务器
const app = express()
app.listen(80, () => {
    console.log('express server running at http://127.0.0.1')
})
监听GET/POST 请求并响应
// 参数1: 客户端请求的url地址
// 参数2: 请求对应的处理函数
// req: 请求对象(与请求相关的属性与方法)
// res: 响应对象(与响应相关的属性与方法)
app.get('请求url', function(req, res) {/* 处理函数*/})
app.post('请求url', function(req, res) {
    //通过 res.send 方法响应客户端
    res.send('请求成功')
})
获取url中携带的查询参数

可以通过 req.query 对象 访问到 req.query默认是一个空对象

app.get('/', (req, res) => {
    // req.query 默认是一个空对象
    // 客户端使用 ?name=zs&age=20 这种查询字符串形式,发送到服务器的参数
    // 可以通过 req.query 对象 访问到 
    // req.query.name req.query.age
    console.log(req.query)
})
获取url中的动态参数

通过 req.params 对象 可以访问到URL 中,通过:匹配的动态参数

// URL 地址中 可以通过:参数名的形式 匹配动态参数值
app.get('/user/:id/:name', (req, res) => {
    //req.params 默认是一个空对象
    // 里面存放着通过: 动态匹配到的参数值
    console.log(req.params)
})
托管静态资源

express 提供了一个非常好用的函数 叫做 express.static() ,可以非常方便的创建一个静态资源服务器,例如 通过以下代码就可以将public 目录下的图片、css文件、javaScript 文件对外开放访问了

app.use(express.static('public'))
// 若要托管多个目录 多次调用 express.static()函数

⚠️注意 Express 在指定的静态目录中查找文件,并对外提供资源访问路径。因此 存放静态文件的目录名不会出现在URL中

http://localhost:8080/images/dd.jpg

http://localhost:8080/cdd/style.css

挂载路径前缀

如果希望在托管的静态资源访问路径之前 挂载路径前缀

app.use('/public', express.static('public'))

http://localhost:8080/public/images/dd.jpg

安装使用nodemon

使用nodemon 工具监听项目文件变动,自动重启项目

npm install -g nodemon

使用nodemon app.js 来启动项目,好处:代码修改之后会被nodemon监听到,从而实现自动重启项目的效果

路由/express 中的路由

Express 路由:客户端的请求与服务器处理函数之间的映射关系

express 路由3部分组成、请求的类型、请求的url地址、处理函数

app.METHOD(PATH, HANDLER)

//eg
app.get('/', function(req, res) {
    res.send('Hello world')
})

路由的匹配过程

每当一个请求到服务器之后,需要先经过路由匹配,,只有匹配成功后,才会调用对应的处理函数

如果请求类型和请求的url同时匹配成功,则 express 会将这次请求转交给对应的function函数进行处理

在这里插入图片描述

⚠️注意点 按照定义的先后顺序进行匹配、请求类型和请求的url同时匹配成功才会调用对应的处理函数

用法

把路由挂载到app上,示例代码

const express = require('express')
const app = express()

//挂载
app.get('/', (rea, res) => {
    res.send('Hello World.')
})
app.post('/', (rea, res) => {
    res.send('post request')
})

app.listen(80, () => {
    console.log('server running  http://127.0.0.1')
})
模块化路由

方便对路由进行模块化的管理,将路由单独抽离为模块

步骤

  1. 创建路由对应的.js文件
  2. 调用express.Router() 函数创建路由对象
  3. 向路由对象上挂载具体的路由
  4. 使用module.exports 向外共享路由对象
  5. 使用app.use() 函数注册路由模块
var express = require('express')

var router = express.Router()

router.get('/user/list', function () {
    res.sen('Get user list')
})

module.exports = router
-------------------------------
//注册 路由  
const router = require('./router')

app.use(router)//注册全局中间件

//也可以路由添加前缀
//app.use('/api', router)

Express-中间件

中间件介绍

中间件:(Middleware),特指的业务流程的中间处理环节

中间件调用流程:当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理

Express中的中间件

本质是一个function处理函数,Express中间件格式如下

在这里插入图片描述

⚠️注意:中间件函数的形参列表中,必须包含next 参数,而路由处理函数中只包含req和res

next函数作用

实现多个中间件连续调用的关键,把流转关系转交给下一个中间件或者路由

在这里插入图片描述

定义中间件函数
const mv = function() {
	console.log('这是一个最简单的中间件函数')
    //在当前中间件的业务处理完毕之后 必须调用 next() 函数
    //表示把流转关系交给下一个中间件或者路由
    next()
}

使用 app.use(mv) 将mv注册为全局生效的中间件(指客户端发起任何请求到达服务器之后都会触发的中间件)

中间件的作用

多个中间件共享同一份 req 和 res ,我们可以在上游的中间件,统一为req或者res 对象添加自定义属性或者方法,供下游中间件或者路由使用

**在这里插入图片描述**

使用app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用

局部生效的中间件

不使用app.use() 定义的中间件叫做局部生效的中间件

const mv1 = function(req,res,next) {
    console.log('中间件mv1')
    next()
}
//mv1这个中间件只在当前路由中生效 这种用法 属于局部生效的中间件
app.get('/',mv1,function(req,res) {
    res.send('page')
})
app.get('/user', funtion(req,res) {
	res.send('User page')        
})
定义多个局部中间件
app.get('/', mw1, mw2, (req, res) => {
    res.send('page')
})

app.get('/', [mv1, mv2], (req, res) => {
    res.send('page')
})
注意

⚠️注意事项

一定要在路由之前定义中间件

客户端发送过来的请求可以连续调用多个中间件进行处理

执行完中间件的业务代码后 ,不要忘记调用next()

防止代码逻辑混乱,调用next() 之后 不要再写额外代码

连续调用多个中间件时,多个中间件之间,共享req和res对象

中间件的分类
  • 应用级别的中间件
  • 路由级别的中间件
  • 错误级别的中间件
  • Express 内置的中间件
  • 第三方中间件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值