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 这个第三方中间件进一步封装出来的
处理第三个错误级别的中间件时放在路由后面注册的,其他的中间件都是在路由之前注册