express学习笔记(1)
1. 路由? 表示前一个字符可选可有可无匹配 acd、abcdapp.get(/ab?cd,(req,res){});: 表示路径参数值为随机例/ab/123/john可通过 req.params.id、req.params.username 获取app.get(/ab/:id/:username,(req,res){});表示前一个字符可重复多次匹配 abcd、abbcd、abbbcd 等app.get(/abcd,(req,res){});表示可匹配任意字符匹配 ab中间任意字符cd如 ab123cd、ab-xxx-cdapp.get(/ab*cd,(req,res){});多个回调函数处理路由中间件 最终处理app.get(/home,(req,res,next){// 验证用户 token 或 cookie 是否过期if(true){next();// 验证通过执行下一个回调}else{res.send(error);}},(req,res){// 查询数据// 返回数据res.send(...);});varc1function(req,res,next){next();};varc2function(req,res,next){next();};varc3function(req,res){res.send();};// 使用回调函数数组处理路由app.get(/xx,[c1,c2,c3]);2.中间件分类学习2.1、应用级别中间件应用级别中间件绑定到 app 对象适用于整个应用的所有路由或特定路径。2.1.1 全局中间件所有请求都会经过// 所有请求都会执行此中间件app.use((req,res,next){console.log(请求路径${req.url}请求时间${Date.now()});next();// 必须调用 next() 才能继续执行后续路由或中间件});2.1.2 限定路径的中间件 只有匹配 /api 开头的请求才会执行app.use(/api,(req,res,next){console.log(API 请求拦截);next();});2.2.3 多个中间件组合应用级别可以使用多个中间件app.use(/user,(req,res,next){console.log(验证用户身份);next();},(req,res,next){console.log(记录用户日志);next();});2.2.4 应用级别错误处理中间件应用级别错误处理必须放在最后app.use((err,req,res,next){console.error(err.stack);res.status(500).send(服务器内部错误);});2.2路由级别中间件路由级别中间件绑定到 express.Router() 实例作用于特定路由模块。2.2.1 创建路由模块// user.js - 独立的路由文件constexpressrequire(express);constrouterexpress.Router();// 路由级别中间件只对当前路由模块生效router.use((req,res,next){console.log(用户模块中间件);next();});// 针对特定路径的中间件router.use(/info,(req,res,next){console.log(用户信息页中间件);next();});// 路由处理router.get(/info,(req,res){res.send(用户信息);});router.post(/login,(req,res){res.send(登录成功);});module.exportsrouter;2.2.3 挂载路由模块到应用// app.jsconstuserRouterrequire(./user);// 将路由模块挂载到 /user 路径app.use(/user,userRouter);2.2.3 路由级别多个中间件// 在路由模块中使用多个中间件router.get(/profile,(req,res,next){// 验证 tokenif(req.headers.token){next();}else{res.status(401).send(未授权);}},(req,res,next){// 查询用户信息req.userInfo{name:张三,age:18};next();},(req,res){// 返回数据res.send(req.userInfo);});2.2.4. 路由级别参数校验中间件router.param(id,(req,res,next,id){// 校验路由参数if(/^\d$/.test(id)){req.userIdid;next();}else{res.status(400).send(参数格式错误);}});router.get(/user/:id,(req,res){res.send(用户ID${req.userId});});2.2.5 静态资源express.static() - 托管静态文件// 将 public 目录下的文件作为静态资源托管app.use(express.static(public));// 访问示例// 文件位置public/images/logo.png// 访问 URLhttp://localhost:3000/images/logo.png// 多个静态资源目录按顺序查找app.use(express.static(public));app.use(express.static(uploads));// 设置虚拟路径前缀app.use(/static,express.static(public));// 访问http://localhost:3000/static/images/logo.png2.2.6 跨域中间件cors - 跨域资源共享npm install corsconstcorsrequire(cors);// 全局启用 CORSapp.use(cors());// 配置特定域名app.use(cors({origin:https://example.com,// 允许的域名methods:[GET,POST,PUT],// 允许的方法credentials:true,// 允许携带凭证optionsSuccessStatus:200}));// 动态配置app.use((req,res,next){constwhitelist[https://site1.com,https://site2.com];constoriginreq.headers.origin;if(whitelist.includes(origin)){res.setHeader(Access-Control-Allow-Origin,origin);}res.setHeader(Access-Control-Allow-Methods,GET, POST);next();});2.2.7 中间件对比总结第三方 morgan 日志记录 npm install morganapp.jsconstmorganrequire(morgan);// 请求日志if(process.env.NODE_ENVdevelopment){app.use(morgan(dev));}类型 名称 主要功能 安装方式内置 express.json() 解析 JSON 请求体 无需安装内置 express.urlencoded() 解析表单数据 无需安装内置 express.static() 托管静态文件 无需安装内置 express.Router() 路由模块化 无需安装第三方 morgan 日志记录 npm install morgan第三方 cors 跨域处理 npm install cors第三方 helmet 安全防护 npm install helmet第三方 compression 响应压缩 npm install compression第三方 express-session 会话管理 npm install express-session第三方 cookie-parser Cookie 解析 npm install cookie-parser第三方 multer 文件上传 npm install multer第三方 express-rate-limit 接口限流 npm install express-rate-limit3.参数