【node】express使用(三)

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>标签进行解析执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【 Vue 3 】Vue3.0所采用的CompositionApi与Vue2.x使用的Options Api 有什么不同?

1. 开始之前 Composition API可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺点TypeScr…

搭建Spark单机版环境

在搭建Spark单机版环境的实战中&#xff0c;首先确保已经安装并配置好了JDK。然后&#xff0c;从群共享下载Spark安装包&#xff0c;并将其上传至目标主机的/opt目录。接着&#xff0c;解压Spark安装包至/usr/local目录&#xff0c;并配置Spark的环境变量&#xff0c;以确保系统…

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏&#xff0c;你的每一个赞每一份关注每一次收藏都将是我前进路…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

鸿蒙Harmony跨模块交互

1. 模块分类介绍 鸿蒙系统的模块一共分为四种&#xff0c;包括HAP两种和共享包两种 HAP&#xff08;Harmony Ability Package&#xff09; Entry&#xff1a;项目的入口模块&#xff0c;每个项目都有且只有一个。feature&#xff1a;项目的功能模块&#xff0c;内部模式和En…

在Semantic Kernel中使用Qdrant向量数据库

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库&#xff0c;并演示如何在Semantic Kernel中进行向量更新和查询操作。 1. 背景 在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中&#xff0c;我们介绍了如何使用 Docker 部署 Qdrant 向…

Python私有属性和私有方法

私有属性和私有方法 在实际开发中&#xff0c;对象的某些属性或者方法只希望在对象内部被使用&#xff0c;而不希望在外界被访问。 私有属性&#xff1a;对象不希望公开的属性 私有方法&#xff1a;对象不希望公开的方法 定义方式&#xff1a;在属性名或者方法名前添加两个下划…

代理重加密+GO开源代码

目录 一、场景说明 二、代理重加密流程 三、具体原理 本地密钥生成​编辑 加密数据​编辑 生成代理重加密密钥​编辑 密钥代理重加密​编辑 重解密密钥​编辑S X_A 解密数据​编辑 四、开源代码 一、场景说明 一个数据方想要将数据发布到云服务器上进行数据共享&am…

VITIS更新硬件平台

VITIS硬件平台更新以后如何重新导入 在之前建立的硬件平台上右击&#xff0c;选择Update Hardware Specification&#xff0c;选择最新导出的硬件平台文件&#xff1b; 重建板级支持包 选择复位重建BSP源文件&#xff0c;然后Clean&#xff0c;再然后Build 参考连接

前端实例:页面布局2--Tab标签页切换(后端数据实现)

效果 index.php(数据库连接部分不写) <!DOCTYPE html> <html><head><style>.tab_pos {display: flex;justify-content: center;align-items: center;background-color: #fff;}/* 设置标签页外层容器样式 */.tab-container {width: 90%;background-col…

PyQt5:Python中最强大的GUI开发工具

目录 PyQt5简介 关键特性 优势 如何开始使用PyQt5 结论 在Python生态系统中&#xff0c;GUI&#xff08;图形用户界面&#xff09;应用程序的开发一直是一个热门话题。有许多工具和框架可供选择&#xff0c;但PyQt5被认为是Python中最强大的GUI开发工具之一。PyQt5是一个P…

ROS机器人虚拟仿真挑战赛学习笔记

仿真效果 146s录屏&#xff1a; ROS机器人虚拟仿真挑战赛rviz跟随base 103s录屏&#xff1a; ROS机器人虚拟仿真挑战赛rviz和gazebo 98s录屏&#xff1a; ROS机器人虚拟仿真挑战赛时间98秒总分65分 F1TENTH线上仿真赛&#xff0c;乃无人车竞速之盛事&#xff0c;以ROS机器人操…

力扣236、235、701、450

一、236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 1.1题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff…

C++ 3.25作业

1、定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream>using namespace std;namesp…

MySQL--Buffer Pool

虽然说 MySQL 的数据是存储在磁盘里的&#xff0c;但是也不能每次都从磁盘里面读取数据&#xff0c;这样性能是极差的。为此&#xff0c;Innodb 存储引擎设计了一个缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;来提高数据库的读写性能。 有了缓冲池后&#xff1a; …

Go微服务实战——metrics指标监控(Prometheus框架与Grafana可视化)

安装Prometheus 参考官网 安装完后访问http://IP:9090如下所示&#xff1a; 这是Prometheus自带的UI。 该地址是数据监控地址http://localhost:9090/metrics所有输出的监控项。 可以正常浏览上述信息是表示安装完成。 Promethus简介 promethus中文网 Prometheus中文文档 …

分享5款能让电脑更高效的软件

​ 你想让你的电脑更好用吗&#xff1f;这里有五款电脑软件可以帮你&#xff0c;它们可以让你的电脑更高效、美观、安全&#xff0c;快来看看吧&#xff01; 1.远程协助——TeamViewer ​ TeamViewer是一款功能强大的远程桌面连接软件&#xff0c;支持跨平台操作&#xff0c;…

基于SSM+Jsp+Mysql的毕业生就业信息管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

牛客网BC-33 统计成绩(数组排序思想)

题目如下 --------------------------------------------------------------------------------------------------------------------------------- 思路&#xff1a;以数组形式输入&#xff0c;并将数组顺序&#xff08;或者逆序&#xff09;排序&#xff0c;最后输出最大值最…

静态代理与动态代理

静态代理与动态代理 静态代理 某个对象提供一个代理&#xff0c;代理角色固定&#xff0c;以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口&#xff0c;这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类…