Express
创始人
2024-01-22 04:16:02

目录

Express介绍

测试最基本的服务器

Express基本使用

托管静态资源

2. 挂载路径前缀 

nodemon

路由

模块化路由 

2.注册使用路由模块

中间件的概念

​编辑1.next函数的作用

2.app.use(全局中间件) 

4.连续多个中间件

5.局部生效中间件

 中间件的分类

1.应用级别的中间件:绑定在路由上 

 2.路由级别的中间件:绑定在router上

8.错误级别的中间件

9.express内置的中间件

例子:发送一组json数据

 自定义中间件

监听前端请求不断传来的数据

1,将解析出来的数据挂载到req.body上


 

Express介绍

测试最基本的服务器

// 1.导入express
const express=require('express')// 2. 创建web服务器
const app=express()// 3. 启动web服务器
app.listen(8080,()=>{console.log('express server running at http://127.0.0.1:8080');
})

Express基本使用

1.我们可以通过req.query得到客户端发送过来的查询参数 

2.可以通过req.params得到url的动态参数

//:id为动态参数
app.get('/user/:id',(req,res){console.log(req.params);res.send(req.params);
})

// 1.导入express
const express=require('express')// 2. 创建web服务器
const app=express()// 4.监听客户端的GET和POST请求,并向客户端响应具体的内容
app.get('/',(req,res)=>{// 调用express提供的res.send()方法,向客户端发送 JSON 对象res.send({name:'zs',age:20,gender:'男'})})app.post('/',(req,res)=>{// 调用express提供的res.send()方法,向客户端响应一个文本字符串res.send('请求成功')
})// 获取url中携带的查询参数app.get('/',(req,res)=>{/*通过req.query可以获取到客户端发送过来的 查询参数注意:默认情况下,req.query是一个空对象*/console.log(req.query);res.send(req.query)
})/*获取url中的动态参数,可以有多个动态参数注意:这里的:id等是一个动态参数
*/app.get('/user/:id/:username',(req,res)=>{// req.params 是动态匹配到的URL参数,默认是一个空对象console.log(req.params);res.send(req.params)})// 3. 启动web服务器
app.listen(8080,()=>{console.log('express server running at http://127.0.0.1:8080');
})

托管静态资源

app.use(express.static('静态资源目录'))

const express=require('express')
const app=express()//1.快速对外调用提供的外部资源
app.use(express.static('./clock'))app.listen(80,()=>{console.log('express server running at http://127.0.0.1')
})

2. 挂载路径前缀 

const express=require('express')
const app=express()//1.快速对外调用提供的外部资源
app.use('/hearts',express.static('./clock'))app.listen(80,()=>{console.log('express server running at http://127.0.0.1')
})

nodemon

 nodemon能够监听项目文件的变动,帮助自动重启项目(热部署)

 1.全局安装nodemon

 npm i -g nodemon

2.启动项目:(能够帮忙自动重启项目,相当于一个守护线程起到热部署的效果)

nodemon xx.js

路由

 2.Express中的路由

 

 3.路由的匹配过程

const express=require('express')const app=express()//将路由挂载到app上
app.get('/',(req,res)=>{res.send('hello word')
})app.post('/',(req,res)=>{res.send('Post request')
})app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

模块化路由 

1.流程:将express创建的服务器app——>app进行监听但是并不挂载路由——>我们再创建一个路由模块,然后向外暴露即可(express.Router())

// 这是路由模块// 1.导入express
const express=require('express')// 2.创建路由对象
const router=express.Router()// 3.挂在具体的路由
router.get('/',(req,res)=>{res.send('Get user list')
})
router.post('/',(req,res)=>{res.send('Add new user')
})// 4.向外导出路由对象
module.exports=router

2.注册使用路由模块

利用app.use()使用路由模块,这个路由就能正常生效

app.use():注册全局中间件,第一个参数可以为全局统一的访问路径

const express=require('express')
const app=express()// 1.导入路由模块
const router=require('./03_router.js')
// 2.注册路由模块 app.use()函数用来注册全局中间件
app.use('/api',router)app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

中间件的概念

1.next函数的作用

 链式调用,实现多个中间件连续调用,把流转关系给到下一个中间件

2.app.use(全局中间件) 

const express=require('express')
const app=express()// 定义第一个全局中间件
app.use((res,req,next)=>{console.log('调用了第一个全局中间件');next()
})// 定义第二个全局中间件
app.use((res,req,next)=>{console.log('调用了第二个全局中间件');next()
})app.get('/',(req,res)=>{res.send('User page')
})app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

 

 3.中间件的作用

4.连续多个中间件

 

const express=require('express')
const app = express()app.use((req,res,next)=>{console.log('调用第一个全局中间件')next()
})
app.use((req,res,next)=>{console.log('调用第两个全局中间件')next()
})
app.get('/user',(req,res)=>{res.send('User page')
})
app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

5.局部生效中间件

先是将结果给到我们的中间件,然后再传递给res,app.use()是中间件全局挂载,我们可以在请求中设置中间件

const express=require('express')
const app=express()// 1.定义局部中间件函数
const mw1=(req,res, next)=>{console.log('调用了第一个局部生效中间件');next()
}
const mw2=(req,res, next)=>{console.log('调用了第二个局部生效中间件');next()
}// 2.创建路由
// mw1只在第一个app.get()中生效
app.get('/',mw1,mw2,(req,res)=>{res.send('home page')
})app.get('/user',(req,res)=>{res.send('user page')
})app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

 

 6.定义多个局部中间件

 中间件的分类

1.应用级别的中间件:绑定在路由上 

 2.路由级别的中间件:绑定在router上

// 这是路由模块// 1.导入express
const express=require('express')// 2.创建路由对象
const router=express.Router()// 3.挂在具体的路由
router.get('/',(req,res)=>{res.send('Get user list')
})
router.post('/',(req,res)=>{res.send('Add new user')
})// 4.向外导出路由对象
module.exports=router
const express=require('express')
const app=express()// 1.导入路由模块
const router=require('./03_router.js')
// 2.注册路由模块 app.use()函数用来注册全局中间件
app.use('/api',router)app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

8.错误级别的中间件

利用中间件对错误进行拦截——>下面定义了一个全局中间件作为错误的拦截,发生错误就进入中间件进行捕获

注意错误级别的中间件需要放在所有路由之后

const express=require('express')
const app=express()// 定义路由
app.get('/',(req,res)=>{// 人为制造错误throw new Error('人为制造错误')res.send('homepage')
})// 错误级别中间件放在所有路由之后 
// 定义错误级别中间件,捕获整个项目的异常错误,防止程序的崩溃
app.use((err,req,res,next)=>{console.log('发生了错误'+err.message);res.send('error:'+err.message)
})app.listen(8080,()=>{console.log('http://127.0.0.1:8080');
})

9.express内置的中间件

例子:发送一组json数据

在服务器我们可以用request.body去接收客户端传来的请求体数据

需要配置一个express.json的中间件进行解析请求的json数据 

const express=require('express')
const app=express()
//通过express.json()解析表单中的JSON格式数据
app.use(express.json)
app.post('/user',(req,res)=>{//接收客户端传来的请求体数据console.log(req,body)res.send('OK')
})

例子2:定义express.urlencoded()中间件,来解析表单中url-encoded格式的数据

 例子3:解析表单对象

 自定义中间件

监听前端请求不断传来的数据

//1.导入模块
const express=require('express')
const app=express()
//2.逻辑
app.use((req,res,next)=>{// 定义具体业务逻辑let str=''//监听req的datareq.on('data',(chunk)=>{str+=chunk})//监听req的end事件req.on('end',()=>{console.log(str)}) 
})//3.指定端口号并且启动web服务器
app.listen(80,()=>{console.log();
})

1,将解析出来的数据挂载到req.body上

使用express内置的模块querystring——>parse()将请求体数据解析为对象格式

 

// 导致内置的querystring模块
const qs=require('querystring')const bodyParser=(req,res,next)=>{// 1.定义str字符串,用来存储客户端发送过来的数据let str=''// 2.监听req的data时间req.on('data',(chunk)=>{str += chunk})// 3.监听req对象的end事件(请求体发送完毕后自动触发)req.on('end',()=>{// 在str中存放的是完整的请求体数据据// console.log(str);// 把字符串格式的请求体数据,解析成为对象格式const body=qs.parse(str)req.body=bodynext()})
}module.exports=bodyParser

引入自己封装的中间件模块

const express = require("express");
const app=express()
// 1.导入自己封装的中间件模块
const customBodyParser=require('./10_拆分自定义中间件')
// 2.将自定义的中间件函数,注册为全局可用的中间件
app.use(customBodyParser)app.get('/',(req,res)=>{res.send(req.body)
})app.listen(8080,()=>{console.log('Express server running st http://127.0.0.1:8080');
})

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
ps局部放大 放大某个部位的图... 软件类学习建议:边看边练习,可以先收藏后学习。一、使用Ctrl快捷键放大:Ctrl + +缩小:Ct...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
ps局部放大 放大某个部位的图... 软件类学习建议:边看边练习,可以先收藏后学习。一、使用Ctrl快捷键放大:Ctrl + +缩小:Ct...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...