Express

news2025/7/16 10:33:26

目录

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的data
   req.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=body
        next()
    })
}

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');
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动驾驶入门:感知

目录 概念 感知方法 CNN 检测与分类 跟踪 分割 Apollo感知 感知设备分类 概念 我们人类天生就配备多种传感器,眼睛可以看到周围的环境,耳朵可以用来听,鼻子可以用来嗅,也有触觉传感器,甚至还有内部传感器&…

Android 性能优化

你会学到什么? 深入底层,全面建立性能优化知识体系; 高手思路,掌握大厂性能调优方法论; 三大模块,实战内存速度包体积优化; 玩转“黑科技”,轻松实现性能优化进阶。 作者介绍 赵…

现货黄金基本知识:黄金策略五大心法

我们经常看电视剧或小说,都会看到一些老套的情景,例如当某个人物死的时候,会讲毕生所学,或者是功夫、或者是知识,传到某一个人的手中。在现货黄金市场,也有累积了历代交易高手的“武功心法”,虽…

Bergsoft NextSuite (VCL) 不同的方式提供数据

Bergsoft NextSuite (VCL) 不同的方式提供数据 BergSoft NextSuite是一家强大的Delphi和CBuilder。NextGrid是一台易于使用的计算机,可以在设计时和设计时理解方法和技能。NextGrid有不止一个StringGrid和ListView美味的标准。NextDBGrid是基于著名NextGrid计算机的…

深入浅出PyTorch——基础知识

一、PyTorch的简介和安装 因为在学习pytorch之前就已经配置和安装好了相关的环境和软件,所以这里就不对第一章进行详细的总结,就简要总结一下: 1.1 pytorch的发展 去了Paper with code网站查看了现在pytorch的使用,远超tensor…

【机器学习】线性分类【下】经典线性分类算法

主要参考了B站UP主“shuhuai008”,包含自己的理解。 有任何的书写错误、排版错误、概念错误等,希望大家包含指正。 由于字数限制,分成两篇博客。 【机器学习】线性分类【上】广义线性模型 【机器学习】线性分类【下】经典线性分类算法 3. 线…

Spring知识点补充

1.常见的ORM框架都有哪些呢? 什么是ORM框架? 所谓的ORM框架,就是对象关系映射框架,就是让我们程序中的类里面的属性直接映射到我的数据库中的表里面的列,我们在Java中操作这个类的时候,就相当于直接操作数据…

Python避坑指南(续)

在上一篇《Python避坑指南》中,我重点给大家讲了Python可变容器数据类型中的坑。除了这些,Python还有其他一些细小方面的坑,本章为大家讲解Python中这些大家可能会忽视的细节。 文章目录链式or的坑访问字面量属性的坑is的坑GIL全局锁的坑多数…

建模杂谈系列177 APIFunc继续实践-比对研究

说明 在最终的实用上,我还是选择了Kettle。主要还是因为考虑未来公司的部署和使用上有比较全的文档,也比较有说服力。所以有时候也挺有趣的: 1 其实APIFunc要好得多,但是(刚做完原型验证)并不能取得大部分人的信任2 有一些方法对于有一定基础的人来说很方便,但是对于更…

剑指offer试题整理1

1、定义一个空的类型,里面没有任何成员变量和成员函数。对该类型求sizeof,得到的结果是什么? 答案:1. 为什么不是0? 空类型的示例中不包含任何信息,本来求siezof应该是0,但是当我们声明改类型的实列是时…

Zookeeper的数据模型和节点类型

数据模型: 树形结构 zk维护的数据主要有:客户端的会话(session)状态及数据节点(dataNode)信息。 zk在内存中构造了个DataTree的数据结构,维护着path到dataNode的映射以及dataNode间的树状层级关…

asp.net+sqlserver团购网站c#

数据需求分析 该网站的主要功能主要体现在对各种信息的添加、修改、删除和查询的操作上,包括会员信息、公司管理信息、订单信息、产品信息、团购管理信息等,各部分的信息之间又有着内在联系,因此总结出如下需求: (1&am…

使去中心化媒体网络相关联的NFT元数据标准

1. 概述 (社交)媒体网络的力量日益强大。我们需要分散这种力量,使网络更加透明。 由于网络效应,新媒体网络和能够与现有网络竞争的去中心化替代方案很难吸引广大公众。 我们建议,与其创建新的协议,将每个平台的内容隔离起来&…

录屏怎么录,这2个方法不容错过!

​我们都知道在电脑使用频率越来越高的现在,无论是生活中还是工作中,有时可能会因为一些需要,使用到录屏的功能。最近,有不少的小伙伴前来询问小编,录屏怎么录?其实答案很简单,接下来小编分享的…

手机号码认证什么价格?手机号码认证怎样申请?

手机号码认证基于通话场景(呼入,呼出)的指定号码,来电展示企业号码专门名称,可提高电话号码辨识度,防止错误标记,提升品牌曝光度、接听率,低成本提升目标顾客接听率。 手机号码认证如何收费呢?…

【附源码】Python计算机毕业设计图书销售网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

数据结构和算法 IV

数据结构和算法 IV 面试题 冒泡排序 排序算法 原理机制: 相邻元素两两比较,大的/小的往后排,一轮比较结束,最大值出现在最大下标处.会比较多轮 代码实现 public static void main(String[] args) {int[] ary {23,12,7,0,67,9,11};for (int i0;i<ary.length-1;i){ //i…

MySQL高频面试题

1. drop&#xff0c;delete和truncate删除数据的区别&#xff1f; delete 语句执行删除是每次从表中删除一行&#xff0c;并且同时将改行的删除操作作为事务记录在日志中保存以便进行回滚。 truncate 则是一次从表中删除所有的数据并不把单独的删除操作记录计入日志&#xff0c…

详述分布式事务Seata TCC空回滚/幂等/悬挂问题、解决方案(seata1.5.1如何解决?)

文章目录一、前言二、问题介绍、seata1.5.1版本之前的解决方案1、空回滚出现原因解决措施事务控制记录表try()、cancel()中获取xid、branch_id2、幂等出现原因解决措施事务控制记录表3、悬挂出现原因解决措施4、总述最终的事务控制记录表三、seata1.5.1版本起官方提供的解决措施…

[附源码]java毕业设计基于Java烟支信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…