IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> express -> 正文阅读

[JavaScript知识库]express

目录

express

express路由

express中间件 ?

写接口


express

??????????? 是基于Node.js,快速、开放、极简的web开发框架,专门用来创建web服务器

?????????? 本质:Npm上的第三方包,提供了创建web服务器的便捷方法

??????????? 好处:提高开发效率

服务器:

?????????? ①Web网站服务器

?????????? ②API接口服务器

安装express ???npm i express@4.17.1


创建基本的服务器

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

监听GET请求

//参数1:客户端请求的URL地址
//参数2:请求对应的处理函数
//req:请求对象 包含了与请求相关的属性和方法
//res:响应对象 包含了与响应相关的属性与方法
app.get('请求URL',function(req,res){
? ? // 处理函数
})

监听POST请求

//参数1:客户端请求的URL地址
//参数2:请求对应的处理函数
//req:请求对象 包含了与请求相关的属性和方法
//res:响应对象 包含了与响应相关的属性与方法
app.post('请求URL', function(req, res) {
? ? // 处理函数
})

把内容响应给客户端

通过res.send()方法,可以把处理好的内容,发送给客户端

// 向客户端发送JSON对象
? ? res.send({name:'zs',age:20,gender:'男'})
// 向客户端发送文本内容
? ? res.send('请求成功')

获取URL中携带的查询参数

app.get('/', (req, res) => {
? ? //req.query默认是一个空对象
? ? // 客户端使用?name=zs&age=20 这种查询字符串形式,发送到服务器的参数?
? ? // 可以通过req.query对象访问到
? ? // 例如:req.query.name ?req.query.age
? ? console.log(req.query);
})

获取URl中的动态参数

//URL地址中,可以通过:参数名的形式,匹配动态参数值
app.get('/user/:id', (req, res) => { //这里的:id是一个动态的参数
? ? // req.params默认是一一个空对象
? ? // 里面存放着通过:动态匹配到的参数值
? ? console.log(req.params);
})

托管静态资源

express.static()

app.use(express.static('public')); //可以访问public目录下的所有文件
// express在指定的静态目录中查找文件,并对外提供资源的访问路径,因此,存放静态文件的目录名不会出现在URL中

托管多个静态多个静态资源文件目录

多次调用express.static()函数即可

app.use(express.static('public')); 
app.use(express.static('files'));

访问静态资源文件时,express.static()函数会根据目录的添加顺序查找所需的文件

挂载路径前缀

app.use('/public', express.static('/public'));//前缀不一定要写静态资源目录名称,但大部分时候使用它

nodemon 监听项目文件的变动 ?npm i -g nodemon

express路由

客户端的请求与服务器处理函数之间的映射关系

请求的类型、请求的URL地址、处理函数

app.Method(PATH,HANDER)

例如:app.get(‘/’,function(req,res){

res.send(‘hello world”))

}

路由匹配过程

每当一个请求到达服务器之后,需要先经过路由匹配,只有匹配成功之后,才会调用对应的处理函数

在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的URL同时匹配成功,则Express会将这次请求,转交给对应的function函数进行处理

注意点:①按照定义的先后顺序进行匹配

??????②请求类型和请求的URL同时匹配成功才会调用对应的处理函数

路由挂载到APP上

基本用法

const express = require('express');
//创建web服务器,命名为app   web服务器实例
const app = express();
//挂载路由
app.get('/', (req, res) => {
? ? res.send('Hello world')
});
app.post('/', (req, res) => {
? ? res.send('Post Request')
});
//启动web服务器
app.listen(80, () => {
? ? console.log('server running at http://127.0.0.1')
});

模块化路由 将路由抽离为单独的模块

①创建路由模块对应的.js文件

②调用express.Router()函数创建路由对象

③向路由对象上挂载具体的路由

④使用module.exports向外共享路由对象

⑤使用app.use()函数注册路由模块

var express=require('express') ?//导入express
var router=express.Router(); ?//创建路由对象
router.get('/user/list',function(req,res){ ? //挂在获取用户列表的路由
? ? res.send('Get user list');
});
router.post('/user/add',function(req,res){ ? //挂载添加用户的路由
? ? res.send('Add new user');
}); 
module.exports=router; ? ?//向外导出路由对象

路由使用

const express=require('express');
const app=express();
//1.导入路由模块
const userRouter = require('./模块化路由.js');
//2.使用app.use()注册路由模块
app.use(userRouter);   
app.listen(80,()=>{
? ? console.log('http://127.0.0.1')
})

为路由模块添加前缀

//导入路由模块
const userRouter=require('./模块化路由.js');
//使用app.use()注册路由模块,并添加统一的访问前缀/api
app.use('/api',userRouter);

express中间件 ?

? ? ? ? ? ? ?? 对请求进行预处理

业务流程的中间处理环节

本质:一个function()处理函数

app.get('/',function(req,res,next){
? ? next();
})

中间件函数的形参列表中,必须包含next参数,而路由处理函数中只包含req和res

next函数的作用

next函数是实现多个中间件连续调用的关键,他表示把流转关系转交给下一个中间件或路由

定义中间件函数

//常量mw所指向的,就是一个中间件函数
const mw = function(req, res, next) {
? ? console.log('这是一个简单的中间件函数');
? ? //注意:在当前的业务处理完毕后,必须使用next()函数
? ? //表示把流转关系转交给下一个中间件或路由
? ? next();
}

全局生效的中间件 客户端发送的任何请求,到达服务器之后,都会触发的中间件

app.use(中间件函数)

中间件作用

多个中间件之间,共享同一份req和res,基于这样的特性,可以在上游的中间件中,统一为req和res对象添加自定义的属性或方法,供下游的中间件或路由进行使用

定义多个全局中间件 ??多次调用app.use() ?按照定义顺序依次调用

局部生效的中间件 ??不使用app.use()定义的中间件

const mw = function(req, res, next) {
? ? console.log('这是一个简单的中间件函数');
? ? next();
}
//mw 这个中间件只在当前路由中生效,这种用法属于局部生效的中间件
app.get('/',mw,function(req,res){
? ? res.send('Home page');
})
//mw这个中间件不会影响下面这个路由
app.get('/',function(req,res){
? ? res.send('User page');
})

定义多个局部的中间件

//以下两种写法是等价的

app.get('/',mw1,mw2,function(req,res){
? ? res.send('Home page');
})
app.get('/',[mw1,mw2],function(req,res){
? ? res.send('Home page');
})

中间件注意事项

①一定要在路由之前注册中间件

②客户端发送过来的请求,可以连续调用多个中间件进行处理

③执行完中间件的业务代码之后,不要忘记调用next()函数

④防止代码逻辑混乱,调用完next()之后不要写格外代码

⑤连续调用多个中间件,多个中间之间,共享req和res对象

中间件分类

①应用级别 ????绑定到app实例上

②路由级别 ????绑定到express.Router实例上

③错误级别 ????专门捕获整个项目中错误发生的异常错误

?????????????function函数中有4个形参,顺序从前到后,分别是(err,req,res,next)

??????????????注意:这个是特殊的,要注册在路由之后

④express内置 ?

? ? ? ? ? ? ? express.static ??无兼容性 ??快速托管静态资源

??????????????express.json ??有兼容性 ?解析JSON格式的请求数据

??????????????express.urlencoded ?有兼容性 ???解析URL-encoded格式的请求数据

app.use(express.json());
app.use(express.urlencoded({ extended: false }));   

⑤第三方

// 获取到客户端的通过请求体,发送到服务器的URL-encoded数据
? ? const body = req.body;
// 获取到客户端的通过查询字符串,发送到服务器的数据
? ? const query = req.query;

写接口

使用express写接口.js

const express = require('express'); //导入express
const app = express(); //创建服务器实例

app.use(express.urlencoded({ extended: false })); //配置解析表单数据的中间件

const apiRouter = require('./apiRouter'); //导入路由模块
app.use('/api', apiRouter); //把路由模块,挂载到app上

app.listen(80, function() { //启动服务器
? ? console.log('express server running at http://127.0.0.1');
})

apiRouter.js

const express = require('express');
const apiRouter = express.Router();


//这里挂载的对应路由
apiRouter.get('/get', (req, res) => {
? ? // 获取到客户端的通过查询字符串,发送到服务器的数据
? ? const query = req.query;
? ? // 调用res.send()方法,把数据响应给客户端
? ? res.send({
? ? ? ? status: 0, //状态,0表示成功,1表示失败
? ? ? ? msg: 'GET请求成功', //状态描述
? ? ? ? data: query, //需要响应给客户端的具体数据
? ? })
})

apiRouter.post('/post', (req, res) => {
? ? // 获取到客户端的通过请求体,发送到服务器的URL-encoded数据
? ? const body = req.body;
? ? // 调用res.send()方法,把数据响应给客户端
? ? res.send({
? ? ? ? status: 0, //状态,0表示成功,1表示失败
? ? ? ? msg: 'POST请求成功', //状态描述
? ? ? ? data: body, //需要响应给客户端的具体数据
? ? })
})

module.exports = apiRouter;

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:23:04  更:2021-10-23 12:25:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:09:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码