介绍
express官网:https://www.expressjs.com.cn/ Express是一个基于node.js的极简、灵活的web应用开发框架。可以快速搭建一个完整功能的网站。Express的作用于node.js中的内置的http模块类似,都是用来创建web服务的。但是http模块使用起来比较繁琐。开发效率低,Express是基于http模块封装出来的,能够极大的提高开发效率。 http与Express的关系:JavaScript原生操作DOM 与 JQuery的关系。
使用
安装Express
在项目的根目录下,输入【npm init】初始化,因为之后打包也要用所以放到生产依赖。
运行
npm i express -S
创建服务器
const express = require("express") //创建服务 let app = express(); //创建路由 app.get("/",(req,res)=>{ res.send("Hello,world!") }) //监听端口 3000 服务器启动提示 app.listen(3000,()=>{console.log("服务器已启动");})
路由
什么是路由
路由就是网址,web服务器会根据用户输入的不同 **路径** 、 **请求方式** ,响应不同的页面。 http常见的请求方式:post(添加),get(获取)put(更新)delete(删除) 匹配规则:每当一个请求到达服务器后,需要经过路由的匹配。匹配请求地址和请求方式,匹配成功后,才会调用对应的处理函数。
基本格式
路由的组成:请求地址+请求方式。
app.method(path,handler) //method:请求方式 //path:请求路径 //handler:请求的处理函数
模块化路由
为了方便对路由进行管理,Express不建议我们将所有的路由都罗列在一个文件中。
我们可以将路由分类,将同一类的路由抽离为一个模块。步骤如下:
-
创建路由模块对应的js文件
-
调用express.Rotuer()方法创建路由对象。
-
在路由对象上挂载具体的路由。
-
使用module.exprots导出路由对象
-
在app.js中使用app.use方法来注册路由模块。
案例:订单路由:order.js文件如下
const express = require("express"); /** * 订单路由模块 */ // 2.调用express.Rotuer()方法创建路由对象。 const order = express.Router(); //3.在路由对象上挂载具体的路由。 order.post("/order/add",(req,res)=> res.send("新增了一个订单")); order.post("/order/edit",(req,res)=> res.send("修改了订单信息")); order.post("/order/del",(req,res)=> res.send("删除了一个订单")); order.get("/order/list",(req,res)=> res.send("查询所有的订单信息")); //4.使用module.exprots导出路由对象 module.exports = order;
app.js文件如下
//在app.js中使用app.use方法来注册路由模块。 app.use(require("./order"));
路由中正则使用
const express = require('express'); const app = express() //路径正则 ? + * () $ // . 任意字符(除了换行和终止符) //Express中路径字符串支持正则 // app.get('/a',(req,res)=>{ // res.send("ok a") // }) // ? 出现0或1次 /abcd /acd // app.get("/ab?cd",(req,res)=>{ // res.send("abcd") // }) // /acd /abcd /abc /ac app.get("/ab?cd?",(req,res)=>{ res.send("abcd") }) // + 一次或者多次 app.get('/xy+',(req,res)=>{ res.send('xy') }) // * 任意个字符 app.get('/m*n',(req,res)=>{ res.send("mn 哈哈哈") }) // () 作为一个整体 // app.get("/e(fg)?h",(req,res)=>{ // res.send('测试') // }) app.get("/e(fg)+h",(req,res)=>{ res.send('测试11') }) app.listen(3000, () => { console.log('run...........'); })
获取参数
获取get参数
通过req.query即可获取get参数。 req.query是一个对象,包含所有的get参数。
//请求地址:http://localhost:3000/list?page=2&pageSize=3 //分页查询 默认一页显示3条数据 app.get("/list",(req,res)=>{ //解构赋值 let {page,pageSize} = req.query; //req.query 是一个对象 res.send(page,pageSize); })
获取post参数
需要先对post参数进行解析配置,然后通过req.body来获取post参数
app.use(express.urlencoded({extended:false})); //接受post请求。 app.post("/add",(req,res)=>{ //req.body获取post参数 res.send(req.body) })
获取动态参数
通过req.params对象来获取动态参数
//动态参数 请求地址: http://127.0.0.1:3000/video/456/hewangle app.get("/video/:id/:name",(req,res)=>{ res.send(req.params); })
中间件 (拦截器)
中间件:处理http请求的函数,做接收到请求和发生响应中间的一系列操作。多个中间件之间,共享同一份req和res。
* 注意(老师讲的): * 1.一般要在路由之前注册中间件 (挨打) * 2.客户端(浏览器)发生来的请求,可以连续调用多个中间件。 * 3.执行完成中间件的代码后,千万千万不要忘记next (挨打) * 4.不要在next之后写代码。 (挨打)
两种注册方式:
app.use() 会匹配所有的请求方式和请求路径。 app.method() method 请求方式。== 路由
中间件的格式:
app.use("路径",(req,res,next)=>{ //中间件的处理。 //将控制权交给下一个中间件或路由 next(); },(req,res,next)=>{ //中间处理 }) 即 app.use("路径",fun1(),fun2(),fun3()……)
中间件的分类:
-
内置中间价 内置中间件 static 又叫静态资源目录
app.use(express.static(__dirname,"public")) [注意:] Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,存放文件的目录名不会出现在URL中。
-
第三方中间件
-
自定义中间件
全局自定义中间件 可以实现全局拦截
add.use('/',(req,res,next)={ 中间处理函数 next(); //标记是否将控制权交给下一个中间件或路由 }) [注意:] 1、尽量不要在next之后写代码 (虽然可以执行但是容易挨打) 2、第一个参数可以省略;省略后就默认是--会匹配所有的请求方式和请求路径局部自定义中间件 可以实现局部拦截
add.method("路径",(req,res,next)={}) add.use("路径",(req,res,next)={}) 局部中间件:多了一个路径的参数 局部中间件是 在哪个接口里写就只对哪个接口有用,局部中间件可以写无数个 只要在合适的地方使用next()就可以一个接一个的往下执行,一般情况下使用局部中间件最多使用一两个就够了 使用多个局部中间件
中间件的执行顺序
1、按照中间件的书写顺序依次向下执行 (会进行路径的匹配) 2、遇到res.send()就在页面输出,同时不会再向下游执行了、反而开始向上游执行 3、每一个中间件的next() 上边的是向下游时的执行代码、下边的是向上游时的执行代码
项目生成器
express-generator 是 express 应用生成器,可以快速生成一个应用的骨架 通过 express demo -e 命令可以快速生成一个项目架构 (-e 是参数, 表示添加 ejs 引擎支持) 全局安装 npm i express express-generator -g 创建项目 express demo -e 安装依赖 cd demo npm install 启动 npm start 文件目录: bin/www 是整个项目的启动文件 public/ 存放静态资源 routes/ 路由配置文件 views/ 视图 app.js 服务文件 package.json 项目配置文件
特别注意: