You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
289 lines
4.9 KiB
289 lines
4.9 KiB
4 months ago
|
# express框架学习
|
||
|
|
||
|
> B站 -前段知识分享喵- 《黑马2020最新 Express 教学视频》
|
||
|
|
||
|
## 特性
|
||
|
|
||
|
1. 简洁的路由定义方式
|
||
|
|
||
|
2. 简化了HTTP请求参数
|
||
|
|
||
|
3. 模板引擎支持度高,方便渲染
|
||
|
|
||
|
4. 中间件,有效控制请求
|
||
|
|
||
|
5. 大量第三方中间件插件
|
||
|
|
||
|
## 框架入门
|
||
|
|
||
|
```js
|
||
|
// 引入express
|
||
|
const express = require("express");
|
||
|
|
||
|
// 创建网站服务器
|
||
|
const app = express();
|
||
|
|
||
|
// 路由
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.send("Hello Node For Express");
|
||
|
// send替代了end
|
||
|
// 1.自动检测响应内容类型
|
||
|
// 2.自动设置HTTP状态吗
|
||
|
// 3.自动设置响应类型和编码
|
||
|
});
|
||
|
|
||
|
app.get("/list",(req,res)=>{
|
||
|
res.send({name:"何小龙",sex:"男"})
|
||
|
})
|
||
|
|
||
|
// 开启服务器监听
|
||
|
app.listen(80)
|
||
|
```
|
||
|
## 中间件
|
||
|
|
||
|
中间件包含**中间件方法**和**中间件处理函数**
|
||
|
中间件由express提供,负责拦截请求,请求函数由开发者提供
|
||
|
```js
|
||
|
app.get("path",fun)
|
||
|
app.post("path",fun)
|
||
|
```
|
||
|
|
||
|
可以出现多个中间件,但是一旦匹配成功就不会再往下进行
|
||
|
|
||
|
### app.use
|
||
|
|
||
|
app.use()中,第一个参数可以不传递路径,对应的是全局,注意需要next()
|
||
|
正常情况下传递路径,和 post,get相同
|
||
|
|
||
|
## 自定义404
|
||
|
|
||
|
```js
|
||
|
// 引入express
|
||
|
const express = require("express");
|
||
|
|
||
|
// 创建网站服务器
|
||
|
const app = express();
|
||
|
|
||
|
app.use((req,res,next)=>{
|
||
|
next()
|
||
|
})
|
||
|
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.send("这里是根目录")
|
||
|
})
|
||
|
|
||
|
// app.use() 这里不能使用/,否则会匹配所有,和不写一样
|
||
|
|
||
|
// 自定义404
|
||
|
// 必须写在最后
|
||
|
app.use((req,res,next)=>{
|
||
|
res.send("请求页面不存在!")
|
||
|
})
|
||
|
|
||
|
|
||
|
// 开启服务器监听
|
||
|
app.listen(80);
|
||
|
console.log("服务器已开启")
|
||
|
```
|
||
|
|
||
|
### 错误处理中间件
|
||
|
|
||
|
```js
|
||
|
app.get("/",(req,res,next)=>{
|
||
|
fs.readFile("./05.js",(err,r)=>{
|
||
|
if (err!=null){
|
||
|
next(err)
|
||
|
}else {
|
||
|
console.log(r.toString())
|
||
|
res.send(r.toString())
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
app.use((err,req,res,next)=>{
|
||
|
res.status(500).send("服务器出现错误"+err)
|
||
|
})
|
||
|
```
|
||
|
|
||
|
### 模块化路由
|
||
|
|
||
|
```js
|
||
|
const app = express();
|
||
|
|
||
|
const index = express.Router()
|
||
|
const home = express.Router()
|
||
|
|
||
|
app.use("/index",index)
|
||
|
app.use("/home",home)
|
||
|
|
||
|
home.get("/",(req,res)=>{
|
||
|
res.send("home")
|
||
|
})
|
||
|
home.get("/hexi",(req,res)=>{
|
||
|
res.send("home/hexi")
|
||
|
})
|
||
|
```
|
||
|
|
||
|
### 模块化编程实现
|
||
|
|
||
|
```js
|
||
|
// 07.js
|
||
|
|
||
|
const express = require("express")
|
||
|
|
||
|
const router = require("./router")
|
||
|
|
||
|
const app = express()
|
||
|
|
||
|
app.use("/home",router.home)
|
||
|
app.use("/index",router.index)
|
||
|
|
||
|
app.listen(80)
|
||
|
|
||
|
|
||
|
// router.js
|
||
|
|
||
|
const Router = require("express").Router
|
||
|
|
||
|
const home = Router()
|
||
|
const index = Router()
|
||
|
|
||
|
home.get("/",(req,res)=>{
|
||
|
res.send("home/")
|
||
|
})
|
||
|
|
||
|
index.get("/",(req,res)=>{
|
||
|
res.send("index/")
|
||
|
})
|
||
|
|
||
|
|
||
|
module.exports= {home,index}
|
||
|
```
|
||
|
|
||
|
### 获取get参数
|
||
|
|
||
|
```js
|
||
|
const express = require("express")
|
||
|
|
||
|
const app = express()
|
||
|
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.send(req.query)
|
||
|
})
|
||
|
|
||
|
app.listen(80)
|
||
|
|
||
|
```
|
||
|
|
||
|
### 获取post参数
|
||
|
|
||
|
```js
|
||
|
// 引入express
|
||
|
const express = require("express");
|
||
|
const bodyParser = require("body-parser")
|
||
|
// 获取post数据,必须导入这个包
|
||
|
|
||
|
// 创建网站服务器
|
||
|
const app = express();
|
||
|
|
||
|
app.use(bodyParser.urlencoded({extended:false}));
|
||
|
// extended为true时,实用qs格式化,效率更高
|
||
|
|
||
|
app.post("/",(req,res)=>{
|
||
|
console.log(req.body.name)
|
||
|
res.send(req.body)
|
||
|
// req.body获取数据
|
||
|
})
|
||
|
|
||
|
// 开启服务器监听
|
||
|
app.listen(80)
|
||
|
```
|
||
|
|
||
|
### use方法
|
||
|
|
||
|
```js
|
||
|
const express = require("express")
|
||
|
|
||
|
const app = express()
|
||
|
|
||
|
app.use(fun())
|
||
|
// 注意这里直接调用函数,所以直接加括号
|
||
|
|
||
|
function fun(){
|
||
|
return (req,res,next)=>{
|
||
|
console.log(req.url);
|
||
|
console.log(req.method);
|
||
|
next()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.send("xsxaxasxasx")
|
||
|
})
|
||
|
|
||
|
app.listen(80)
|
||
|
```
|
||
|
|
||
|
### 动态路由
|
||
|
|
||
|
```js
|
||
|
const express = require("express")
|
||
|
|
||
|
const app = express()
|
||
|
|
||
|
app.get("/user/:id",(req,res)=>{
|
||
|
res.send(req.params)
|
||
|
})
|
||
|
// 动态路由,实用':'
|
||
|
// req.params来获取
|
||
|
|
||
|
app.listen(80)
|
||
|
```
|
||
|
|
||
|
### 静态文件
|
||
|
|
||
|
```js
|
||
|
const express = require("express")
|
||
|
const path = require("path")
|
||
|
const app = express()
|
||
|
|
||
|
app.use(express.static("static"))
|
||
|
console.log(path.join(__dirname,"static"))
|
||
|
// 最好实用console中的地址
|
||
|
// 嗲用地址不用static
|
||
|
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.send("你好")
|
||
|
})
|
||
|
|
||
|
app.listen(80)
|
||
|
```
|
||
|
|
||
|
### 模板文件
|
||
|
|
||
|
```js
|
||
|
// express官方微了art-template模板引擎更好的适用于express,在其基础上封装了press-art-template
|
||
|
|
||
|
const express = require("express")
|
||
|
|
||
|
const app = express()
|
||
|
|
||
|
// 当渲染后缀会art的模板时,实用express-art-template
|
||
|
// 可以使用多种模板引擎
|
||
|
// 模板后缀,选用的模板引擎
|
||
|
app.engine("art",require("express-art-template"))
|
||
|
|
||
|
// 设置模板存放地址
|
||
|
app.set("views","templates")
|
||
|
|
||
|
// 设置模板默认后缀
|
||
|
app.set("view engine","art")
|
||
|
|
||
|
app.get("/",(req,res)=>{
|
||
|
res.render("index",{data:"data"})
|
||
|
})
|
||
|
|
||
|
app.listen(80)
|
||
|
```
|
||
|
|
||
|
### app.locals公共数据
|