问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

node.js-路由、中间件、mysql

发布网友 发布时间:2024-09-05 23:24

我来回答

1个回答

热心网友 时间:2024-12-05 11:58

首先今天先看到路由的概念,什么叫做路由?

路由就是映射关系,在express中路由指的是客户端请求和服务器处理函数的映射关系,路由有三部分组成:请求类型、请求url和处理函数。

app.get(url,callback)其实就跟我们前面所说的监听事件一样一一样的。

Go

const?express?=?require('express')const?app?=?express()app.get('/',?(req,?res)?=>?{????res.send('收到get请求')})app.listen(80,?()?=>?console.log('express?server?running?at?http://127.0.0.1'))

这就是一个最简单的路由。路由的匹配过程,每当一个请求到达服务器器后,需要先经过路由匹配,当请求类型和url匹配成功后才会调用后面的请求函数。、

用法

最简单的用法就是像我们上面那样直接挂在实例上,这也是不推荐的,因为一个请求就要挂一个很麻烦很繁琐。

科学的方法应该是创建路由模块。

分为五个步骤:

分别是创建路由js文件、调用express.Router创建路由对象、挂载路由、向外导出路有对象最后我们的入口文件需要导入,在通过app.use去注册

Go

//?1.导入expressconst?express?=?require('express')//?2.创建路由对象const?router?=?express.Router()//?3.挂载路由//?3.1挂载路由获取用户的信息router.get('/user/:id',?(req,??res)?=>?{????res.send(req.params)})//?3.2挂载路由接受用户发送的请求router.post('/post',?(req,?res)?=>?{????res.send('post成功')})//?4.向外共享路由成员mole.exports?=?{????express,????router?}

Go

const?express?=?require('./02模块化路由')const?app?=?express.express()//??注册路由app.use(express.router)app.listen(80,?()?=>?console.log('express?server?running?at?http://127.0.0.1'))

这里说一下app.use昨天也看到了,他其实就是一个用来注册全局中间件的。然后我们还可以为路由挂载前缀,也是通过app.use来添加方法同昨天基本一样

中间件

指的是业务流程的中间处理环节。

就是当客户请求到达服务器后,可连续调用多个中间件对这个请求进行预处理,最后通过路由发送出来。

中间件的本质是一个函数根路有类似但是多了一个参数,next参数。

next是一个函数它的作用就是实现多个中间件连续调用的关键,把流转关系转给下一个中间件或者路由,每个中间件都有一个next一个转下去转到路由没有了就响应给客户端了。

2.1

我们先看到全局生效的中间件,意思就是客户发起的任何请求,他都会触发,直接通过app.use来注册即可

Go

const?express?=?require('express')const?app?=?express()//?中间件const?mw?=?function(req,?res,?next)?{????//?res.send('这是中间件环节')????console.log('这是中渐渐环节')????next()}//?通过app。use定义为全局生效的中间件app.use(mw)app.get('/user',?(req,?res)?=>?{????res.send('这是get请求')})app.post('/post',?(res,?req)?=>?{????res.send('这是一个post请求')})app.listen(80,?()?=>?{????console.log('http://127.0.0.1');})

中间件的作用:

多个中间件共享同一个res和req,所以可以在上游的中间件定义好这些对象,下游直接用包括路由也可以用

怎么来定义多个全局中间件,直接通过app.use定义多个即可就像昨天所说的托管静态资源,有多个目录就注册多个

2.2

局部中间件

不是用app.use只对部分的路由有效,路由的参数规则也发生了改变

Go

const?express?=?require('express')const?app?=?express()const?mw?=?function(req,?res,?next)?{????req.time?=?Date.now()????next()}app.get('/',?mw,?(req,?res)?=>?{????res.send('局部生效'?+?req.time)})app.get('/user',?(req,?res)?=>?res.send('没有生效')?+?req.time)app.listen(80,?()=>?{????console.log('http://127.0.0.1');})

定义多个局部中间件

写多个函数过后在参数这里可以用逗号隔开,也可以直接写一个数组

有一个注意事项:就是一定要在路由之前去注册中间件,不然路由执行完了谁还来执行中间件。

2.3

中间件的分类

①应用级别中间件

就是通过get、post、use绑定到app上的中间件

②路由级别中间件

就是在我们刚才的路由模块里面来穿插的一个中间件

③错误级别中间件

这个有点说法

它是专门用来捕获错误信息的而且形参变为了四个

他也是唯一一个卸载路由后面的中间件

Go

const?express?=?require('express')const?{?rename?}?=?require('fs')const?app?=?express()app.get('/',?(req,?res)?=>?{????//?1.人为抛出一个错误,一旦有错后面的响应就不会执行了????throw?new?Error('服务器内部发生错误')????res.send('我不能执行出来')})//?2.错误中间件app.use((err,req,res,next)?=>?{????//?2.1向服务器打印错误????console.log(err.message);????//?2.2向客户端发送错误????res.send(err.message)????//?这样做?好处就是,前面如果发生了错误导致了整个服务器已经崩溃了,什么都执行不了了,这样一来,就可以正常输出错误信息,正常执行后面代码})app.listen(80,?()?=>?console.log('express?server?running?at?http://127.0.0.1'))

④内置中间件

三个内置的中间件分别是express.static这个已经说过了前面

express.json这是拿来解析json格式数据的

express.urlencoded这是拿来解析urlencoded格式数据的

后面两个一般会配合req.body来拿请求体数据再给他们拿来解析了

Go

const?express?=?require('express')const?app?=?express()//?注意这是中间件?所以必须配置到路由之前app.use(express.json())app.use(express.urlencoded({extended?:?false}))app.post('/',?(req,?res)?=>?{????//?通过req.body可以拿到请求体数据????//?postman在测试的时候选择body里面的raw再把text选择json就可以发送json数据了????console.log(req.body);????//?没有解析之前对于json数据是undefined})//?测试urlencoded数据体//?这个数据体的格式是x-www-form-urlencoded//?固定写法app.post('/user',?(req,?res)?=>?{????//?没解析前时空对象????console.log(req.body);})app.listen(80,?()?=>?console.log('express?server?running?at?http://127.0.0.1'))

⑤第三方中间件直接npm安装导入通过app.use注册即可使用

2.4

自定义中间件

这里做一个案例自定义一个类似于express.urlencoded功能的中间件可以解析请求体数据

Go

const?express?=?require('express')const?app?=?express()//?4.利用node里面的一个内置模块解析请求体数据,在node里面内置了一个querystring模块是专门用来处理查询字符串的,这个模块提供的//?parse()函数可以把查询字符串转换为对象const?qs?=?require('querystring')//?1.定义中间件app.use((req,?res,?next)?=>?{//?2.监听data事件,因为既然是服务器,那么肯定会接收到癞子客户端的请求,如果有时候请求量过大,就会分批次传给服务器数据,所以data事件可能触发多次//?就需要把每一次的数据最后拼接起来let?str?=?''req.on('data',?chunk?=>?{????str?+=?chunk})//?3.req的end事件当请求体接收完毕会自动出发end事件可以在这里处理完整的请求体数据req.on('end',?()?=>?{????console.log(str);????str?=?qs.parse(str)????console.log(str);????//?5.讲解洗出来的对象给到req.body????req.body?=?str????next()})})app.post('/',?(req,?res)?=>?{????res.send(req.body)})app.listen(80,?()?=>?console.log('http://127.0.0.1'))

然后将自定义中间件进行了一个模块化

Go

//?4.利用node里面的一个内置模块解析请求体数据,在node里面内置了一个querystring模块是专门用来处理查询字符串的,这个模块提供的//?parse()函数可以把查询字符串转换为对象const?qs?=?require('querystring')//?因为别人导入进来是直接注册使用所以可以把app开服务器等一些多余的代码省略就保存app.use里面的const?bodyParse?=?(req,?res,?next)?=>?{????//?2.监听data事件,因为既然是服务器,那么肯定会接收到癞子客户端的请求,如果有时候请求量过大,就会分批次传给服务器数据,所以data事件可能触发多次????//?就需要把每一次的数据最后拼接起来????let?str?=?''????req.on('data',?chunk?=>?{????????str?+=?chunk????})????//?3.req的end事件当请求体接收完毕会自动出发end事件可以在这里处理完整的请求体数据????req.on('end',?()?=>?{????????console.log(str);????????str?=?qs.parse(str)????????console.log(str);????????//?5.讲解洗出来的对象给到req.body????????req.body?=?str????????next()????})}mole.exports?=?bodyParse

Go

const?bodyParse?=?require('./自定义中间件模块化')const?express?=?require('express')const?app?=?express()app.use(bodyParse)app.post('/',?(req,?res)?=>?{????//?res.send('收到get请求')????console.log(req.body);})app.listen(80,?()?=>?console.log('express?server?running?at?http://127.0.0.1'))

我们继续看到用express来写接口

分为了三个步骤

创建基本服务器、创建api路由模块、编写get接口

这是路由模块

Go

//?1.导入expressconst?express?=?require('express')//?2.创建路由对象const?router?=?express.Router()//?3.挂载路由//?3.1挂载路由获取用户的信息router.get('/user/:id',?(req,??res)?=>?{????res.send(req.params)})//?3.2挂载路由接受用户发送的请求router.post('/post',?(req,?res)?=>?{????res.send('post成功')})//?4.向外共享路由成员mole.exports?=?{????express,????router?}0

其实主要就是通过req的那几个属性拿到数据后,再通过send方法发给客户端,下面是入口文件主要就是开启服务器,然后解析下数据

Go

//?1.导入expressconst?express?=?require('express')//?2.创建路由对象const?router?=?express.Router()//?3.挂载路由//?3.1挂载路由获取用户的信息router.get('/user/:id',?(req,??res)?=>?{????res.send(req.params)})//?3.2挂载路由接受用户发送的请求router.post('/post',?(req,?res)?=>?{????res.send('post成功')})//?4.向外共享路由成员mole.exports?=?{????express,????router?}1

有些东西要把后面看了才知道哈我只是先拿上来了。

cors和jsonp

我们刚才这个案例其实是有bug的,就是有跨域的问题,我们创建一个html文件通过button来获取数据这个时候就会因为协议不同而被同源策略组织。

我们前面也说过解决跨域一个是cors一个是jsonp,这里肯定不能用jsonp因为他只支持get,那么怎么来用cors呢?

直接三部曲安装导入加注册就解决了跨域问题了,就这么简单。

4.1

什么是cors

就是由一系列http响应头组成,同源策略碰到这个头就会解除*。

cors一般是在服务器进行配置,客户端不需要。

下面是一些了解性内容

响应头部:

第一个res.setHeader(‘Access-Control-Allow-Orign’,‘http:wwwssss。聪明、’)

这是表示只允许后面这个网站的域来访问,如果为*那就表示允许任何域来访问了

第二个是前面的基础上为Allow-Headers

我们的cors默认值只有9个请求头如果超出了这个九个头就必然失败请求,在这个九个之外的可以通过这个代码来添加上来

第三个前面的基础上-Methods

cors默认只支持getposthead除此之外的需要用这个来设置。

4.2

现在不是了解内容了。

cors请求分类

大体上分为简单请求和预检请求。

什么叫做简单请求

满足两个条件:

一个是请求方式在默认的三个之内,一个是http请求头不能超过默认的九个

什么是预检请求

三个条件达到其中一种都是

一个是请求头在九个之外,一个是请求方式在三个之外,还有一个就是发送过来的数据是json数据

那么他们的区别是什么呢

很简单,简单请求只会发送一次请求,而预检请求会发送两次请求,为什么?

因为预检请求会在服务器与客户端正是连接之前,提前发一个option的请求作为预检,看服务器能否跟这个格式的请求相连接,只有请求成功了才会开始正式请求,携带真实数据。

今天最后一个内容jsonp接口

首先要注意一下,如果说已经配置了cors那么必须在配置cors之前去声明jsonp接口,不然会错乱的。

做这个接口之前我们先来回应一下jsonp的一个知识,首先它是来解决跨域的,我们通过script标签把函数传进来再去调用接口这种方式就叫jsonp

Go

//?1.导入expressconst?express?=?require('express')//?2.创建路由对象const?router?=?express.Router()//?3.挂载路由//?3.1挂载路由获取用户的信息router.get('/user/:id',?(req,??res)?=>?{????res.send(req.params)})//?3.2挂载路由接受用户发送的请求router.post('/post',?(req,?res)?=>?{????res.send('post成功')})//?4.向外共享路由成员mole.exports?=?{????express,????router?}2
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
街头篮球手游中锋攻略汇总 C位攻略大全 街头篮球手游中锋有什么技巧 中锋C技巧详解 php一个表单提交数据怎么区分开,隐藏域可以吗,如果可以怎么用。 梦见牙掉光了什么预兆 梦见牙齿掉完了是什么征兆 梦见牙齿全掉了是什么预兆 梦见一口牙全部掉了是什么预兆 教师年度考核不认课的领导班子成员,干的工作不少,怎样考核办法公平... 湖北省郧西县义务教育学校绩效工资实施办法绩效工资总量和水平的... 事业单位年底是否有绩效奖金的 一加手机和find7哪个好 .三年级上册作文自我介绍男孩一百五十个字左左 苏州常太大客户营业部在哪里 民事诉讼被告不出庭法院咋执行 小狗汪汪叫怎么说。 民事诉讼被告人不出庭法官怎么判? 前段时间不这样 最近皮肤暗黄眼睛难受鼻子不通气怎么办啊? 论述明清家具各自特点,50字至100字左右 问:我以前捏着鼻子眼睛会通气,最近捏着鼻子用力眼睛都不会排出气 雷丁电车新能源电车和海全新能源汽车合作吗? 留学美国20大禁忌点夜间不要乘地铁 融入美国最忌讳的8件事!不做错比做对更重要。 加盟蜜思罗雅女装怎么样 冰粉可以加什么水果 手工冰粉是什么做的 冰粉里面的粉是啥做的 人参的食用方法和用量 人参的服用方法有哪些 人参怎么吃营养又美味? 感恩教师的话语有哪些? 武汉理工大学往年的录取分数线在辽宁是多少?预估分574有希望吗_百度... 程序员招聘要求(程序员的要求) 一加手机和oppofind7那个好? 激光洗眉后应该注意些什么 怎么洗眉 车,怎么联网? 北戴河有什么好吃的 北戴河特产有哪些 智能网联是什么公司  出生于1993年新历8月4日,农历六月17,中午12点05分出生体重3400克请... 14年年末的比亚迪f3自动挡,发动机有异响,跪求大神? 13款比亚迪f3发动机有温度后挂挡加油提速车哒哒响 1993年阴历8月初4是什么星座 1994年8月4日是农历多少 比亚迪f3在加速的时候带哨音声音特别大是怎么回事? 肌肉( )题目:词语巧搭配 扁囤和尚拜师少林 使用企业标准检验是不是超资质能力 关于2023年度国家级资质认定检验检测机构 监督抽查情况的通告_百度知 ... 华为nova5z配置参数(华为nova5z屏幕参数) 金丝熊吃什么粮 捡成语有哪些