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