Express
1.Express是基于Node.js平台,快速,开放,极简的Web开发框架
2.Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的
3.Express就是一个npm上的第三方包,提供了快速创建Web服务器的方法
网址: http://www.expressjs.com.cn/
Express和http内置模块的关系:
Express是基于Node.js内置的http模块进一步封装起来的,能够极大的提高开发效率
对于前端最常见的两种服务器:
1.Web网站服务器:专门对外提供Web网页资源的服务器
2.API服务器:专门对外提供API接口的服务器
Express的基本使用:
1.安装Express
先初始化项目
npm init
//一路回车
//生成package.json配置文件
然后再安装Express
npm i express@4.17.1
//@4.17.1是选择安装的版本
2.基本的使用
2.1创建基本的Web服务器
// 1.导入express
const express = require("express")
// 2.创建web服务器
const server = express();
// 3.调用server.listen(端口号,回调函数),启动服务器
//server.listen()一般是放在所有代码的后面
server.listen(8080, () => {
// 成功启动服务器后,执行以下的代码
console.log("服务器启动了,端口号:8080");
})
2.2监听GET请求
通过**server.get()**方法,可以监听客户端的GET请求
/*
server.get(x,y)
x:客户端请求的url地址
y:请求对应的处理函数
*/
/*
req:请求对象(包含了与请求相关的属性与方法)
res:响应对象(包含了与响应相关的属性与方法)
*/
server.get("/", function (req,res) {
// 处理的函数
res.send("hello")
})
2.3监听POST请求
通过**server.post()**方法,可以监听客户端的POST请求
/*
server.post(x,y)
x:客户端请求的url地址
y:请求对应的处理函数
*/
/*
req:请求对象(包含了与请求相关的属性与方法)
res:响应对象(包含了与响应相关的属性与方法)
*/
server.post("/", function (req,res) {
// 处理的函数
res.send("hello")
})
2.4把内容响应给客户端
通过**res.send()**方法,可以把处理好的内容,发送给客户端
server.get("/user", (req,res)=> {
// 向客户端发送JSON对象
// 浏览器:http://localhost:8080/user
res.send({name:'zs',age:20,sex:'男'})
})
server.post("/user", (req,res)=> {
// 向客户端发送文本内容
res.send("hello")
})
2.5获取url中携带的查询参数
通过req.query对象可以访问到客户端通过查询字符串的形式,发送到服务器的参数
server.get("/user", (req,res) => {
// req.query默认是一个空对象({})
// console.log(req.query);
// 客户端在访问路径后用?与参数隔开,参数与参数之间用&隔开
// http://localhost:8080/user?name=zs&age=20
// name=zs&age=20就是客户端发给服务器的参数
res.send(`${req.query.name}——————————${req.query.age}`)
})
2.6获取url中的动态参数
通过req.params对象,可以访问到url中通过**😗*匹配到的动态参数
server.get("/user/:id", (req, res) => {
// req.params默认是一个空对象({})
// console.log(req.params);
// req.params里面存放的是通过:动态匹配到的参数值
// http://localhost:8080/user/666
// 666就是动态匹配的id的参数值
res.send(req.params.id)
})
综合:
// 1.导入express
const express = require("express")
// 2.创建web服务器
const server = express()
// 监听客户端的GET和POST请求,并向客户端响应具体的内容
/* server.get("/user", (req, res) => {
// 调用express提供的res.send()方法,向客户端响应一个JSON对象
// http://localhost:8080/user
res.send({ name: 'zs', age: 20, sex: '男' })
}) */
server.post("/user", (req, res) => {
// 调用express提供的res.send()方法,向客户端响应一个JSON对象
// http://localhost:8080/user
res.send("post请求成功")
})
/* server.get('/', (req, res) => {
// 通过req.query,可以获取到客户端发送过来的查询参数
// req.query默认是一个空对象{}
// http://localhost:8080/?name=zs&age=20
// name=zs&age=20就是req.query的内容,是一个对象
console.log(req.query);
res.send(req.query)
}) */
// :id/:uname是两个动态参数,有:在前面的都是动态参数(写在路径里面),
server.get("/user/:id/:uname", (req,res) => {
// req.params是动态匹配到的url参数,默认也是空对象({},就是路径后面不加参数)
console.log(req.params);
res.send(req.params)
})
// 监听端口,后面的回调函数要不要无所谓
server.listen('8080', () => {
console.log("服务器启动了,地址:localhost:8080");
})
3.托管静态资源
3.1 express.static()
通过它,可以非常方便地创建一个静态资源服务器
// 1.导入express
const express = require("express")
// 2.创建web服务器
const server = express()
// 访问某个文件下的文件
// 这样就可以访问test文件夹内的所有文件,访问路径不用加上test,直接/后面加上想要文件
// http://localhost:8080/ 默认打开的是index.文件
// http://localhost:8080/list.html 查看test文件夹下的list.html文件
// server.use(express.static("./test"))
// 访问某个文件
// http://localhost:8080/index 可以设置要访问的文件的路径
server.use("/index",express.static("index.html"))
// 监听端口,后面的回调函数要不要无所谓
server.listen('8080', () => {
console.log("服务器启动了,地址:localhost:8080");
})
3.2托管多个静态资源目录
// 若要托管多个静态资源目录,那就多次调用express.static()函数,
// 函数会根据目录的添加顺序查找所需的文件
server.use(express.static("./test"))
server.use(express.static("./show"))
3.3挂载路径前缀
在静态资源访问路径前面,挂载路径前缀
//要访问test文件夹下面的文件,必须在访问路径后面加上/test才可以
//http://localhost:8080/test/ 默认打开index文件
server.use("/test",express.static("test"))
4.nodemon
若是使用node app.js调试项目,每次修改代码之后,都要手动关掉服务器,再重新启动,很麻烦
nodemon能够监听项目文件的变动,当diamante被修改后,保存后,nodemon会自动帮我们重启项目,
极大方便了开发和调试
4.1安装nodemon
//-g全局安装
npm install -g nodemon
4.2使用nodemon
传统的方式是: node app.js
nodemon的方式是:nodemon app.js
Express路由
路由:广义上来说路由就是映射关系
在Express中,路由是指客户端的请求与服务器处理函数之间的映射关系
Express中的路由分3部分组成:请求的类型(method),请求的URL地址(path),处理函数(handler)
服务器地址+请求的url地址
server.method(path,handler)
路由的匹配过程:每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才会调用对应的处理函数。在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的 URL 同时匹配成功,则 Express 会将这次请求,转交给对应的 function 函数进行处理
匹配的注意点:
① 按照定义的先后顺序进行匹配
② 请求类型和请求的URL同时匹配成功,才会调用对应的处理函数
最简单的路由用法
// 1.导入express
const express = require("express")
// 2.创建web服务器
const server = express()
// 挂载路由
server.get('/', (req,res) => {res.send("hello get") })
server.post('/', (req,res) => {res.send("hello post") })
// 监听端口,后面的回调函数要不要无所谓
server.listen('8080', () => {
console.log("服务器启动了,地址:localhost:8080");
})
为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块
就是将路由的逻辑代码放在另一个js文件,然后导出,需要使用就导入
步骤:
① 创建路由模块对应的 .js 文件
② 调用 express.Router() 函数创建路由对象
③ 向路由对象上挂载具体的路由
④ 使用 module.exports 向外共享路由对象
⑤ 使用 app.use() 函数注册路由模块
index.js页面:创建路由
// 1.导入express
const express = require("express")
// 2.创建路由对象
const router = express.Router()
// 3.挂载获取用户列表的路由
router.get("/user/list", (req,res)=>{
res.send("get user list")
})
// 4.挂载添加用户的路由.
router.post("/user/add", (req,res)=>{
res.send("add user")
})
// 5.向外导出路由对象router
module.exports=router
test.js页面:使用路由
// 1.导入express
const express = require("express")
// 2.导入路由模块,路由对象router
const router = require("./router")
// 创建服务器对象
const server = express()
// 3.使用server.use()注册路由模块
server.use(router)
// 监听端口,后面的回调函数要不要无所谓
server.listen('8080', () => {
console.log("服务器启动了,地址:localhost:8080");
})