【node】express使用(三)

news2024/11/15 20:49:16

1、express.static快速托管静态资源

express:快速、开放、极简的Web开发框架。(npm第三方包,提供快速创建web服务器便捷方法)

Express中文官网

(1) express快速创建web网站服务器以及api接口服务器

// 1、导入express
const express = require('express')
// 2、创建web服务器
const app = express();
// 3、调用app.listen(端口号,启动成功后回调函数),启动服务器
app.listen(80,()=>{
    console.log('express server running at http://127.0.0.1');
})

(2) 监听GET和POST请求

// 参数1:客户端请求url地址
// 参数2:请求对应的处理函数 req请求对象,res响应对象
app.get('请求url',function(req,res){
...
})

app.post('请求url',function(req,res){
...
})

 (3) 把内容响应给客户端

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

app.get('/user',(req,res)=>{
res.send({name:'zs',age:20,gender:'男'})
})

app.post('/user',(req,res)=>{
res.send('请求成功!')
})

(4)获取url中携带的查询参数

通过req.query对象,访问客户端通过查询字符串的形式,发送服务器参数:

app.get('/',(req,res)=>{
console.log(req.query)
})

(5) 获取URL中的动态参数

通过req.params对象,可以访问到URL中,通过:匹配到动态参数

app.get('/user/:id',(req,res)=>{
console.log(req.params)
})

(6)托管静态资源

express.static()创建静态资源服务器;按照引入顺序查找

app.use(express.static('静态文件夹'))
// 挂载路径前缀
app.use('/public',express.static('静态文件夹'))

 (7)nodemon安装

监听项目文件变动,自动重启项目

npm install -g nodemon

 

2、express路由

路由-映射关系

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

三部分组成:请求的类型,请求的url地址,处理函数

app.METHOD(PATH,HANDLER)

 路由的匹配过程,只有匹配的类型和url都正确,才会转到处理函数。顺序按照定义顺序进行匹配。

npm init

npm install express

// 创建index.js 入口文件
// 执行(或者nodemon index.js)
node index.js
// index.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(80, () => {
    console.log('http://127.0.0.1');
});

 3、路由模块化

为了方便对路由进行模块化的管理,Express 不建议将路由直接挂载到 app 上,而是推荐将路由抽离为单独的模块将路由抽离为单独模块的步骤如下:

① 创建路由模块对应的 js 文件
② 调用 express.Router() 函数创建路由对象
③ 向路由对象上挂载具体的路由
④ 使用 module.exports 向外共享路由对象
⑤ 使用 app.use() 函数注册路由模块

// user.js
const express = require('express');
var router = express.Router();

router.get('/user/list', (req, res) => {
    res.send('Hello World!');
});
router.post('/user/add',(req,res)=>{
    res.send('add new user')
})
module.exports = router;

// index.js
const express = require('express');
const userRouter = require('./router/user')
const app = express();
app.use(userRouter);
app.listen(80, () => {
    console.log('http://127.0.0.1');
});

路由添加前缀

app.use('/api',userRouter);

4、常见的express中间件

中间件(Middleware),特指业务流程的中间处理环节。

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

next函数的作用

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

const mw = function(req,res,next){
    // 把流转关系转交下一个中间件或路由
    next();
}

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

注意:

  1. 一定在路由之前写中间件
  2. 客户端请求可以调用多个中间件
  3. 中间件要用next函数返回
  4. next()之后不要写别函数
  5. 调用多个中间件,共享req和res

 (1) 全局生效的中间件(使用app.use调用)

可以在全局使用多个中间件调用

app.use( (req,res,next)=>{
    // 第一个
    next();
})
app.use( (req,res,next)=>{
    // 第二个
    next();
})

  (2) 局部生效的中间件

app.get('/user',mw,(req,res)=>{
    res.send("hello word")
})

//多个的情况
app.get('/user',mw1,mw2,(req,res)=>{
    res.send("hello word")
})

app.get('/user',[mw1,mw2],(req,res)=>{
    res.send("hello word")
})

 

中间件的分类

  1. 应用级别中间键(通过use(),get(),post()挂载到app实例上)
  2. 路由级别中间件(绑定到express.Router上)
  3. 错误级别的中间件(捕获项目异常,参数顺序,err,req,res,next)
  4. express内置中间件(3个 :express.static;express.json;express.urlencoded)
  5. 第三方中间件
app.use(express.json);

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

  自定义中间件步骤:

  1. 定义中间件
  2. 监听 req 的 data 事件
  3. 监听 req的 end 事件
  4. 使用 querystring 模块解析请求体数据
  5. 将解析出来的数据对象挂载为 req.body
  6. 封装到一个单独js模块

4、express创建API接口

创建一个基本服务器

const express = require('express');
const router = require('./apiRouter');
const app = express();

const port = process.env.PORT || 5000;

app.use('/',router);
app.listen(port,()=>{
    console.log(`server running on port 127.0.0.1:${port}`)
})

 get方法

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

router.get('/user',(req,res)=>{
    const query = req.query;
    res.send({
        status:0,
        msg:'GET success!',
        data:query
    })
})
module.exports = router;

post方法

router.post('/add',(req,res)=>{
    const body = req.body;
    res.send({
        status:0,
        msg:'GET success!',
        data:body
    })
})

5、express跨域cors资源共享

解决接口跨域问题的方案主要有两种

  1. CORS(主流的解决方案,推荐使用)
  2. JSONP(有缺陷的解决方案:只支持 GET请求)

cors 是 Express 的一个第三方中间件。通过安装和配置 cors 中间件,可以很方便地解决跨域问题使用步骤分为如下 3步:

  1. 运行 npm install cors 安装中间件
  2. 使用 const cors =require(cors”)导入中间件
  3. 在路由之前调用 app.use(cors())配置中间件

CORS(Cross-Origin Resource Sharing,跨域资源共享)由一系列 HTTP 响应头组成,这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源。

浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如果接口服务器配置了 CORS 相关的 HTTP 响应头就可以解除浏览器端的跨域访问限制。

  • CORS 主要在服务器端进行配置。客户端浏览器无须做任何额外的配置,即可请求开启了 CORS 的接口。
  • CORS 在浏览器中有兼容性。只有支持 XMLHttpRequest Level2 的浏览器,才能正常访问开启了 CORS 的服务端接口(例如:IE10+、Chrome4+、FireFox3.5+)
响应头

Access-Control-Allow-Origin:响应头部中可以携带一个 Access-Control-Allow-Origin 字段,

Access-Control-Allow-Headers:默认情况下,CORS 仅支持客户端向服务器发送如下的9个请求头: Accept,Accept-Language、Content-Language、DPR、Downlink, Save-Data、 Viewport-Width、 Width.Content-Type(值仅限于 text/plain、multipart/form-data、application/x-www-form-urlencoded 三者之一)
如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过 Access-Control-Allow-Headers 对额外的请求头进行声明,否则这次请求会失败!

Access-Control-Allow-Methods:默认情况下,CORS 仅支持客户端发起 GET、POST、HEAD 请求。如果果客户端希望通过 PUT、DELETE 等方式请求服务器的资源,则需要在服务器端,通过 Access-Control-Alow-Methods来指明实际请求所允许使用的 HTTP 方法。

预检请求

只要符合以下任何一个条件的请求,都需要进行预检请求:

  • 请求方式为 GET、POST、HEAD 之外的请求 Method 类型
  • 请求头中包含自定义头部字段
  • 向服务器发送了 application/json 格式的数据

在浏览器与服务器正式通信之前,浏览器会先发送 OPTION 请求进行预检,以获知服务器是否允许该实际请求,所以这一次的 OPTION 请求称为“预检请求”服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。

简单请求的特点:客户端与服务器之间只会发生一次请求。

预检请求的特点:客户端与服务器之间会发生两次请求,OPTION 预检请求成功之后,才会发起真正的请求。

jsonp

实现 JSONP 接口的步骤

  1. 获取客户端发送过来的回调函数的名字
  2. 得到要通过 JSONP 形式发送给客户端的数据
  3. 根据前两步得到的数据,拼接出一个函数调用的字符串
  4. 把上一步拼接得到的字符串,响应给客户端的<script>标签进行解析执行

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

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

相关文章

ITES | 深圳工业展正运动重磅产品即将亮相

■展会名称&#xff1a; 第二十五届深圳国际工业制造技术及设备展览会&#xff08;以下简称“深圳工业展”&#xff09; ■展会日期 2024年3月28日-31日 ■展馆地点 中国深圳国际会展中心(宝安) ■展位号 9号馆F04 2024年深圳工业展(ITES)将于3月28日至31日在深圳宝安国…

Android Studio详细安装教程及入门测试

Android Studio 是 Android 开发人员必不可少的工具。 它可以帮助开发者快速、高效地开发高质量的 Android 应用。 这里写目录标题 一、Android Studio1.1 Android Studio主要功能1.2 Android应用 二、Android Studio下载三、Android Studio安装四、SDK工具包下载五、新建测试…

20240320-1-梯度下降

梯度下降法面试题 1. 机器学习中为什么需要梯度下降 梯度下降的作用&#xff1a; 梯度下降是迭代法的一种&#xff0c;可以用于求解最小二乘问题。在求解损失函数的最小值时&#xff0c;可以通过梯度下降法来一步步的迭代求解&#xff0c;得到最小化的损失函数和模型参数值。…

阶乘的最高位

阶乘的最高位 题目描述 输入一个正整数n。输出n!的最高位上的数字。 输入 输入一个正整数n&#xff08;n不超过1000&#xff09;。 输出 输出n!的最高位上的数字。 样例输入 1000样例输出 4解 这道题要是求阶乘的后三位或者后几位&#xff0c;大家肯定都会。 求最高…

web服务应用术语

一、HTTP 协议详解 TCP 协议与 HTTP 协议 TCP 协议主要用于数据传输控制&#xff0c;而 HTTP 协议主要用于应用层面的数据交互。 HTTP 属于应用层协议&#xff0c;是建立在 TCP 协议基础之上的&#xff0c;HTTP 协议以客户端请求和服务器端响应为标准&#xff0c;浏览器通常称…

JavaSE+JDBC进行控制台输出的客户管理系统! (实训/课堂实践推荐)

本人博客&#xff1a;玖玖的个人博客 (zhangxi.online)&#xff0c;欢迎大家来踩 该文章原地址&#xff1a; JavaSEJDBC进行控制台输出的客户管理系统! (实训/课堂实践推荐&#xff09; (zhangxi.online) 本人诚挚的特别感谢&#xff1a;尚硅谷/黑马程序员提供的学习案例 项…

玩转云计算:教你在Akamai Linode上构建IT架构–定义项目

时至今日&#xff0c;选择以云计算方式来运维业务&#xff0c;已经成为大部分情况下的最优选。那么如果要从零开始开发一个新应用&#xff0c;并依托云平台来设计、开发、部害和远维&#xff0c;具体该从何处下手&#xff1f;这一系列文章将介绍如何基于Akamai Linode平台实现这…

通过Appium和Xcode Accessibility Inspector获取iOS应用元素定位的方法

在 iOS 移动应用程序上使用选择器查找元素定位是我们在移动端 UI 自动化测试的先决条件。 但是&#xff0c;由于应用程序内容在原生 iOS 应用程序中的呈现方式&#xff0c;我们可以用来定位应用程序元素的选择器与 Web 浏览器元素有很大不同。 在本文中&#xff0c;我们将了解 …

将markdown文档中的图床外链图片下载到本地文件夹

markdown图床外链图片下载到本地代码 前言 因为文章发到先知或者攻防社区需要本地图片&#xff0c;而我的图片从来都是上传到图床&#xff0c;所以编写了一个脚本实现了把markdown文章中所有含有外链图床的图片转储到本地的文件夹。 然后发布文章时再手动一个个上传图片。 详细…

STM32的IAP计数,BootLoader

来源 三种下载方式&#xff1a; 1、ICP&#xff1a;ST-Link, 2、ISP: FlyMcu, 3、IAP IAP简介 IAP技术的核心在于BootLoader程序的设计&#xff0c;这段程序预先烧录在单片机中&#xff0c;正常的APP程序可以使用BootLoader程序中的IAP功能写入&#xff0c;也可以两部分代码一…

comfyui 代码结构分析

comfyui的服务器端是用aiohtttp写的&#xff0c;webui是fastapi直接构建的&#xff0c;但是其实comfyui的这种设计思路是很好的&#xff0c;也许我们不需要在后端起一个复杂的前台&#xff0c;但是可以借助json结构化pipeline&#xff0c;然后利用node节点流把整个流程重新映射…

部署云原生边缘计算平台kubeedge

文章目录 1、kubeedge架构2、基础服务提供 负载均衡器 metallb2.1、开启ipvc模式中的strictARP2.2、部署metalb2.2.1、创建IP地址池2.2.2、开启二层转发&#xff0c;实现在k8s集群节点外访问2.2.3、测试 3、部署cloudcore3.1、部署cloudcore3.2、修改cloudcore的网络类型 4、部…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 (Recommend)2.3 预编译包安装 3 编译 ORB-S…

cesium 创建实体

1、 entity 1.1 entity类型整理 Entity分类 1.2 entity添加 椭圆 const ellipse new Cesium.Entity({position: Cesium.Cartesian3.fromDegrees(114.3, 39.9, 100),ellipse: {semiMinorAxis: 30000, //椭圆的短半轴semiMajorAxis: 40000, //椭圆的长半轴extrudedHeight: 0…

FPGA工程师及其相关岗位招聘~

社区的招聘功能上线之后&#xff0c;许多企业都在上面发布了招聘岗位。 目前有30企业&#xff0c;岗位围绕FPGA工程师&#xff0c;涵盖嵌入式软件工程师、射频工程师、C语言开发、BMC工程师等等&#xff0c;入口放在这里&#xff1a;F学社-全球FPGA技术提升平台 登录账号后&a…

Swift知识点(二)

6. 闭包表达式与闭包 闭包表达式&#xff08;Closure Expression&#xff09; 闭包表达式是一种在简短行内就能写完闭包的语法 也就是&#xff0c;闭包表达式&#xff0c;只是一种简洁、快速实现闭包的语法 Swift 的闭包表达式拥有简洁的风格&#xff0c;鼓励在常见场景中实现…

VLAN的原理及配置

文章目录 一、VLAN的概述1、VLAN的概念2、VLAN的优势 二、静态VLAN三、静态VLAN的配置1.VLAN的范围2.VLAN基本配置 四、Trunk和access的作用参考 一、VLAN的概述 1、VLAN的概念 VLAN就是将网络从逻辑上划分为若按个小的网络&#xff0c;也就是虚拟局域网。 2、VLAN的优势 使…

KingSCADA|如何实现文本显示设备的实时通讯状态?

哈喽,你好啊,我是雷工! 在SCADA项目中,有些要求在界面上实时显示SCADA系统与设备的实时通讯状态,来及时了解PLC或其他设备与SCADA系统的通讯状态是否正常,以及简单的通讯异常分析,在KingSCADA中该如何实现通讯状态的文本显示呢? 接下来用简单的样例介绍KingSCADA如何实…

Vue3尚硅谷张天禹笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

整数的反转

给定一个整数&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&#xff0c;否则反转后得到的新数的最高位数字不应为零。 public class _01数字反转 {public static void main(String[] args) {Scanner input n…