Express2.0——中间件

86 篇文章 0 订阅
26 篇文章 0 订阅

Express2.0

路由前缀

test.js

// 在这个界面就只用导入路由,注册路由使用,其他的都不用再做与路由相关的代码
// 导入express
const express = require("express")
// 创建服务器对象
const server = express()
// 通过模拟表单获取数据
// post的req.body
server.use(express.urlencoded({extended:false}))
// 导入路由模块,路由对象router
const router = require("./router")
//使用server.use()注册路由模块
// 使用server.app()注册路由模块,并添加统一的访问前缀/api
server.use("/api",router)

// 监听端口,后面的回调函数要不要无所谓
server.listen('8080', () => {
    console.log("服务器启动了,地址:localhost:8080");
})

router.js

// 1.导入express
const express = require("express")
// 2.创建路由对象
const router = express.Router()

// http://localhost:8080/api/user?name=zs&age=20
// req.query:{name:'zs',age:20}
router.get("/user", (req, res) => {
    // req.query是获取查询字符串(在地址栏上面)
    res.send(req.query)
    console.log(req.query);
})
// 一般get使用查询字符串req.query获取数据
// post使用模拟表单req.body获取数据

router.post('/reg', (req, res) => {
    // 需要注册中间件:express.urlencoded({extended:false})
    // req.body是模拟表单传过来的字符串
    res.send(req.body)
    console.log(req.body);
})

// 向外导出路由对象router
module.exports=router


Express中间件

中间件(Middleware):业务流程的中间处理环节,本质上就是一个function处理函数,在参数列表中除了有req,res,还必需包含next参数,路由处理函数中只包含req,res

function(req,res,next){}

**next **函数就是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由

有多个中间件时,会按照从上到下的先后顺序依次调用

先走中间件再先走路由,若中间件不放行(不调用next()),就不会执行到路由,一直在加载,中间件是写在路由在前面

中间件执行过程:先使用执行去全局中间件,再执行局部中间件

全局中间件

客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件

通过调用app.use(中间件函数),即可定义一个全局生效的中间件

const express = require("express")
const app = express()

// 全局中间件,中间件放在注册路由的前面
app.use(function (req,res,next) {
    console.log("这是全局中间件");
    // 在当前中间件业务处理完毕后,调用next()函数转接到下一个中间件或者路由
    // 若是这里没有放行,页面就一直在加载
    next()
})

app.get('/api', function (req,res) {
    console.log('我在中间件后面');
    res.send('hello')
})

// 监听端口
app.listen('8080', () => {
    console.log("已启动服务器,localhost:8080");
})
局部中间件

不用app.use()定义的中间件就是局部中间件

const express = require("express")
const app = express()

// 局部中间件mv,不使用app.use()定义的
const mw1=function (req,res,next) {
    console.log("这是第一个局部中间件");
    next()
}
const mw2=function (req,res,next) {
    console.log("这是第二个局部中间件");
    next()
}
//使用局部中间件,只在当前路由有效的,在其他路由无效
// app.get('/api',mw1,mw2, function (req,res) {
//     console.log('我在中间后面');
//     res.send('我是局部中间件的')
// })
// 多个局部中间件的使用,这两种方式是一样的,用哪个都行
app.get('/api',[mw1,mw2], function (req,res) {
    console.log('我在中间后面');
    res.send('我是局部中间件的')
})

// 监听端口
app.listen('8080', () => {
    console.log("已启动服务器,localhost:8080");
})
中间件的作用

多个中间件之间,共享一份req和res,因此可以在开始的中间件中统一为req和res对象添加自定义的属性或方法,供后面的中间件或者路由使用

中间件的注意事项

① 一定要在路由之前注册中间件
② 客户端发送过来的请求,可以连续调用多个中间件进行处理
③ 执行完中间件的业务代码之后,不要忘记调用 next() 函数
④ 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码
⑤ 连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象

中间件的分类
应用级别的中间件:

通过app.use()|app.get()|app.post(),绑定到app实例上的中间件

路由级别的中间件:

绑定到express.Router()实例上的中间件

错误级别的中间件:

专门用来捕获整个项目中法中的异常错误,从而防止项目异常崩溃的问题

const express = require("express")
const server = express();
// 1.路由
server.get("/api", function (req, res) {
    // 1.1抛出一个自定义的错误(这里抛出错误了,所以下面的hello就输出不了)
    //  throw new Error("服务器内部发生错误")
    res.send("hello")
})
// 2.错误级别的中间件,有四个参数,第一个获取错误,第二个获取请求,第三个获取响应,第四个是放行,
// 只有这个错误级别的中间件放在路由后面,其他的中间件都是放在路由前面
server.use((err, req, res, next) => {
    // 这里抛了,后面的代码也执行不了了
    throw new Error("服务器内部发生错误")
    console.log("发生错误了" + err.message);
    res.send("Error!" + err.message)
    // 因为这里已经是在路由后面,而且也没有中间件了,所以不用调用next()
})
// 监听端口
server.listen('8080', () => {
    console.log("服务器启动了");
})
Express (4.16.0以上)内置的中间件:

1.express.static:托管静态资源,如HTML文件,图片,css样式表等(无兼容性)

2.express.json:解析JSON格式的请求体数据(有兼容性,仅在4.16.0版本中可用)

3.express.urlencoded:解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0版本中可用)使用app.post()

const express = require("express")
const server = express();
// 托管静态资源
// 打开http://localhost:8080/,会默认打开test文件夹下的静态文件(默认打开index.html),若是要打开test文件加下的其他文件,在地址后面添加路径即可,如:http://localhost:8080/login.html
server.use(express.static("./test"))

// 在postman那里测试
// 配置解析application/json格式数据的内置中间件
server.use(express.json())
// 配置解析application/x-www-form-urlencoded
server.use(express.urlencoded({ extended: false }))

// 监听端口
server.listen('8080', () => {
    console.log("服务器启动了");
})

第三方的中间件

非express官方内置的,而是由第三方开发出来的中间件。在项目中按需下载并配置第三方中间件,从而提高项目的开发效率

body-parser(在express@4.16.0之前使用):用来解析请求体数据

① 运行 npm install body-parser 安装中间件
② 使用 require 导入中间件
③ 调用 app.use() 注册并使用中间件

注意:Express 内置的 express.urlencoded 中间件,就是基于 body-parser 这个第三方中间件进一步封装出来的

处理第三个错误级别的中间件时放在路由后面注册的,其他的中间件都是在路由之前注册

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值