目录
一、Express框架简介
Express是基于Node.js平台,快速、开放、极简的 Web 开发框架。简单来说,Express作用与http模块类似,不仅保留了http的基本API,还额外封装了一些新方法,比起http模块开发效率更高。Express也提供了中间件功能,包含内置中间件、第三方中间件以及自定义中间件三种中间件,可用于拦截请求和响应,对请求和响应进行功能扩展。
二、安装和使用
1.安装
在当前项目目录中,终端运行如下命令:
npm install express
2.用express创建基本Web服务器
//1.导入Express
const express = require('express')
//2.创建Web服务器
const app = express()
//3.启动服务器
app.listen(8080,()=>{
console.log('express is running at http://127.0.0.1:8080')
})
三、Express路由
1.路由概念
路由是指确定应用程序如何响应客户端对特定端点的请求,该端点是URI(或路径)和特定HTTP请求方法(GET、POST等)。
路由定义采用以下结构:
app.METHOD(PATH, HANDLER)
//app是express实例对象
//METHOD是HTTP请求方法,如get、post
//PATH是服务器路径
//HANDLER是回调处理函数
2.创建基本路由
①.创建一个简单的get路由
app.get("/user", (req, res) => { // 监听get请求'/user'
// 返回JSON对象
res.status(200).send({ name: "zhangsan", age: 20, height: 180 });
});
② 创建一个简单的post路由
app.post("/list", (req, res) => { //监听post请求'/list'
// 返回成功信息
res.send({ code: 200, message: "success" });
});
3.路由模块化
由于文件较大,不推荐路由直接挂载到app上,为了方便管理,我们抽离单独路由模块,调用express.Router()创建路由对象。
①创建router.js文件
// 1.导入express
const express = require("express");
// 3.调用express.Router()创建路由对象
const router = express.Router();
// 3.挂载get请求
router.get("/user", (req, res) => {
res.status(200).send({ name: "zhangsan", age: 20, height: 180 });
});
// 4.挂载post请求
router.post("/list", (req, res) => {
res.send({ code: 200, message: "success" });
});
// 5.导出路由对象
module.exports = router
② 导入路由模块,并注册路由
//1.导入Express
const express = require("express");
//2.创建Web服务器
const app = express();
//3.导入路由模块
const router = require("./router");
//4.注册路由模块,访问时带'/api'前缀
app.use('/api',router);
//5.启动服务器
app.listen(8081, () => {
console.log("express is running at http://127.0.0.1:8081");
});
③ 启动服务器,访问api
四.获取参数方式
1.获取url中查询字符串,并动态返回内容
app.get("/getUser", (req, res) => {
const { query } = req; // 获取req.query:解析url中的查询字符串,并返回一个对象
let result = {};
if (query.name == "zhangsan") { // 根据name动态返回信息
result = { code: 200, message: "success" };
} else {
result = { code: 404, message: "failure" };
}
res.send(result);
});
① name为zhangsan时
② name为lisa时
2.获取url动态参数,并动态返回内容
app.get("/getBMI/:height/:weight", (req, res) => {
const { params } = req; // 获取动态参数
let bmi = params.weight / Math.pow(params.height / 100, 2); // 计算传入的动态参数
let result = getBmi(bmi); // 调用获取bmi方法
res.send(result); // 返回相应内容
});
function getBmi(bmi) { // 获取bmi
if (bmi <= 18.4) {
return { code: 200, message: "偏瘦", bmi: bmi };
} else if (bmi > 18.4 && bmi < 24) {
return { code: 200, message: "正常", bmi: bmi };
} else if (bmi >= 24 && bmi < 28) {
return { code: 200, message: "过重", bmi: bmi };
} else if (bmi >= 28) {
return { code: 200, message: "肥胖", bmi: bmi };
} else {
return { code: 404, message: "请输入正确内容" };
}
}
五、Express中间件
1.中间件概念
中间件是工作在客户端和服务器之间的中间组件,主要用于拦截请求和响应,对请求和响应进行功能扩展的中间组件。
2.中间件工作流程
3.创建一个中间件
const mw = function(req,res,next){
console.log("我是一个中间件")
next() //必须调用next(),表示流转关系转入下一个中间件或路由
}
4.中间件使用
① 全局使用
多个中间件之间,共享同一份 reg 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 reg 或res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
const mw = function (req, res, next) {
req.createTime = new Date().toLocaleString(); //共享createTime
next();
};
app.use(mw); // 注册全局中间件
app.get("/user", (req, res) => {
res.send("创建时间为" + req.createTime); // 获取全局中间件createTime参数
});
注意:全局中间件可以有多个,按照注册顺序依次调用
app.use(function (req, res, next) {
console.log("我是第一个全局中间件");
next();
});
app.use(function (req, res, next) {
console.log("我是第二个全局中间件");
next();
});
app.get("/user", (req, res) => {
res.send("调用/user");
});
② 局部使用
局部中间件挂载在路由中,只在当前路由接口生效
const mw = function (req, res, next) {
req.createTime = new Date().toLocaleString(); //共享时间
next();
};
app.get("/user", mw, (req, res) => {
res.send("userApi创建时间为" + req.createTime); // 可以获取createTime
});
app.get("/id", (req, res) => {
res.send("idApi创建时间为" + req.createTime); // 无法获取createTime,返回undefine
});
挂载多个局部中间件 [mw1,mw2,etc] 或 mw1,mw2,etc
app.get("/user", [mw1, mw2, etc], (req, res) => {
res.send("调用/user")
})
app.get("/user", mw1, mw2, etc, (req, res) => {
res.send("调用/user")
})
5.中间件注意事项
①一定要在路由之前注册中间件
②客户端发送过来的请求,可以连续调用多个中间件进行处理
③执行完中间件的业务代码之后,不要忘记调用next()函数
④为了防止代码逻辑混乱,调用next()函数后不要再写额外的代码
⑤连续调用多个中间件时,多个中间件之间,共享req和res对象
6.中间件分类
官方将中间件分为五类
① 应用级别的中间件
通过app.use()、app.get()、app.post()等,绑定到app实例上的中间件,叫做应用级别的中间件。
应用级别的中间件可以调用next('route')跳到下一路由.注意:next('route')只作用于app.METHOD() 或router.METHOD()
app.get("/user/:id",function (req, res, next) {
// 如果id为0则跳到下一个路由
if (req.params.id === "0") next("route");
// 否则控制权交给堆栈中的下一个中间件函数
else next();
},
function (req, res, next) {
// 返回regular
res.send("regular");
}
);
app.get("/user/:id", function (req, res, next) {
// id为0时返回special
res.send("special");
});
② 路由级别的中间件
绑定到express.Router()实例上的中间件,叫做路由级别的中间件。用法与应用级别中间件没有差别。
路由级别的中间件可以调用next('route')跳到下一路由
router.get('/user/:id', function (req, res, next) {
// 如果id为0则跳到下一个路由
if (req.params.id === '0') next('route')
// 否则控制权交给堆栈中的下一个中间件函数
else next()
}, function (req, res, next) {
// 返回regular
res.send('regular')
})
// id为0时返回special
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id)
res.send('special')
})
③ 错误级别的中间件
用来捕获项目中发生的异常错误,防止项目异常崩溃的中间件叫做错误级别的中间件。
错误级别的中间件只能捕获前面路由的错误,一般放在最后注册使用,与其他中间件相反
app.get("/", function (req, res, next) {
throw new Error("服务器异常");
res.send("special");
});
const error = function (err, req, res, next) {// 只能捕获前面路由的错误,一般放在最后
console.log(err.message);
res.status(500).send(err.message);// 返回500 错误信息
};
④ 内置中间件
Express内置了三个常用中间件express.static、express.json、express.urlencoded。
1)express.static
作用:托管静态资源,如html、img、css等
具体步骤如下:
Ⅰ.创建file文件夹,并在文件夹中新建index.html
Ⅱ.托管静态文件
不挂载路径前缀访问
app.use(express.static("file"))
挂载路径前缀访问
app.use("/file", express.static("file"))
Ⅲ.访问静态资源
注意:如果要托管多个静态资源,需要多次调用express.static()函数。
访问静态资源时,会根据添加顺序来查找
2)express.json
作用:解析JSON格式数据
app.use(express.json())
3)express.urlencoded
作用:解析URL-encoded数据
app.use(express.urlencoded( extended:false ))
⑤ 第三方中间件
非Express官方内置的,而是第三方开发出来的中间件称为第三方中间件。使用第三方中间件需要先进行install下载,并导入对应的模块,最后调用app.use()注册使用。
e.g. cookie-parser
1)安装cookie-parser
npm install --save-dev cookie-parser
2)导入并注册使用
const cookieParser = require("cookie-parser");
app.use(cookieParser());
3)设置cookie
res.cookies('key','value',option)
4)获取cookie
console.log(req.signedCookies['key'])
六、搭建服务器
1.安装express
npm install express
2.编写路由router.js
// 1.导入express
const express = require("express");
// 2.调用express.Router()创建路由对象
const router = express.Router();
// 3.挂载路由
router.get('/get',(req,res)=>{
const {query} = req // get请求获取query
res.send({
status:200,
message:"get success",
data:query
})
})
router.post('/post',(req,res)=>{
const {body} = req // post请求获取body
res.send({
status:200,
message:"post success",
data:body
})
})
// 4.导出路由对象
module.exports = router
3.编写服务器server.js
//1.导入Express
const express = require("express");
//2.创建Web服务器
const app = express();
//3.注册urlencoded中间件,获取post请求体
app.use(express.urlencoded({extended:false}))
//4.导入路由对象
const router = require("./router");
//5.挂载路由
app.use('/api',router);
//6.启动服务器
app.listen(8081, () => {
console.log("express is running at http://127.0.0.1:8081");
});
4.启动服务器
在server.js上级目录下运行该命令
node server