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

2 years 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公共数据