express框架搭建后台服务
express
- 1. 使用express创建web服务器:
- 2. 中间件
- 中间件分类:
- 3.解决跨域问题:
- 1. CORS
- 2.JSONP
1. 使用express创建web服务器:
1. 导入express2. 创建web服务器3. 启动web服务器
// 1. 导入express
const express = require('express')// 2. 创建web服务器
const app = express()// 4.监听客户端的GET和POST请求, 并且向用户响应具体内容
app.get('/user', (req, res) => {res.send('请求成功')
})app.post('/user', (req, res) => {// 调用express提供res.send方法,向客户端响应一个JSON对象res.send({name:'ly', age: 18})
})// 3. 启动web服务器
app.listen(8080, () => {console.log(`app listening`);
})
- 获取URL中携带的查询参数 http://127.0.0.1?name=ly&age=18
req.query对象,可以访问到客户端通过查询字符串。
- 获取URL中的动态参数
req.params对象,可以访问到URL中,通过:匹配到的动态参数。
- express.static(root, [options])创建一个静态资源服务器。
root参数指定提供静态资源的根目录。
eg: app.use(express.static(‘public’))
注意: express在指定的静态目录中查找文件,并对外提供资源的访问路径,因此,存放静态文件的目录名不会出现在url中。
-
路由:客户端请求与服务器处理函数之间的映射关系。
创建模块化路由:1. 导入express2. 创建web服务器(1. 导入路由模块2. 注册路由模块)3. 启动服务器
路由模块:
- 导入express
- 创建路由对象(express.Router())
- 挂载具体路由
- 向外导出路由对象
2. 中间件
本质上也是一个function处理函数。
注意: 中间件函数的形参列表中, 必须包含next参数。而路由处理函数只包含req和res。
-
next()实现多个中间件连续调用,表示把流转关系转交给下一个中间件或路由。
-
通过app.use()将中间件函数注册为全局生效的中间件。
中间件作用: 多个中间件之间,共享同一份req和res。基于这样特性,在上游中间件中,统一为req和res对象自定义添加属性和方法,则下游中间件或路由就可以使用。
// 导入express
const express = require('express')const app = express()// 定义中间件
app.use((req, res, next) => {console.log('第一个中间件');next()
})app.use(function(req, res, next) {console.log('第二个中间件');next()
})// 定义路由
app.get('/', (req, res) => {res.send('hhh')
})
app.listen(80, () => {console.log('serve running');
})
- 不使用app.use()定义的中间件—局部生效的中间件。
定义多个局部中间件 : app.get(‘/’, mw1, mw2, (req, res) => { …})或者app.get(‘/’, [mw1, mw2], (req, res) => { …})
注意事项:
- 必须在路由之前 注册中间件
- 客户端发送过来请求,可以连续调用多个中间件
- 执行完中间件业务代码之后,要调用next() 函数
- next()函数后面不要额外写代码
- 多个中间件中,共享req和res
中间件分类:
- 应用级别的中间件
通过app.use(),app.METHOD()绑定到app实例上的中间件—应用级别的中间件。 - 路由级中间件
绑定到express.Router() 实例上的中间件。 - 错误处理的中间件
捕获整个项目中发生的异常错误。— (err, req, res, next) 必须有4个形参
const express = require('express')const app = express()// 定义一个路由
app.get('/', (req, res) => {// 人为抛出异常throw new Error('服务器出错!!')res.send('hhh')
})// 定义一个错误中间件,捕获项目异常,防止程序崩溃
app.use((err, req, res, next) => {console.log('发生了错误' + err.message);res.send('Error' + err.message)
})app.listen(80, () => {console.log('serve running');
})
错误中间件必须注册在路由之后
-
express内置的中间件
- express.static 提供静态资源,例如 HTML 文件、图片等。
- express.json 解析json格式的请求体数据。 注意:适用于 Express 4.16.0+
- express.urlencoded 使解析URL-encoded格式的请求体数据。 注意:适用于 Express 4.16.0+
-
第三方的中间件
编写接口:1. 创建express服务器2. 创建API路由模块3. 编写get, post等接口
get,post接口会出现跨域问题。
3.解决跨域问题:
- CORS
- JSONP (只支持GET)
1. CORS
使用cors中间件解决跨域问题:
1. 下载第三方库 npm install cors 安装中间件
2. const cors = require('cors') 导入中间件
3. 调用app.use(cors())配置中间件
cors由一系列http响应头组成,这些http响应头决定浏览器是否阻止前端JS代码跨域获取资源。
cors在服务器端进行配置。
cors在浏览器中有兼容性。
cors响应头部: -Access-Control-Allow-Origin
响应头部携带一个-Access-Control-Allow-Origin : | * 字段 // origin参数指定了允许访问该资源的外域URL, *通配符,表示任意URL都通过。
res.setHeader(‘-Access-Control-Allow-Origin’,‘http://nim.cn’)
cors响应头部: -Access-Control-Allow-Headers
cors响应头部: -Access-Control-Allow-Methods 指明实际请求所允许使用的http方法。 —cors仅支持GET、POST、HEAD请求。
客户端在请求CORS接口时,根据请求方式和请求头的不同,可以将cors请求分为两大类:
-
简单请求
- 请求方式: GET、POST、HEAD三者之一
- HTTP头部信息不超过以下几种字段: 除了被用户代理自动设置的标头字段(例如 Connection、User-Agent 或其他在 Fetch 规范中定义为禁用标头名称的标头),
允许人为设置的字段为 Fetch 规范定义的对 CORS 安全的标头字段集合。该集合为:
Accept
Accept-Language
Content-Language
Content-Type(需要注意额外的限制)
Range(只允许简单的范围标头值 如 bytes=256- 或 bytes=127-255)
Content-Type 标头所指定的媒体类型的值仅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded
-
预检请求:
在浏览器和服务器之间进行通信之前,浏览器会发送OPTION请求进行预检,以获知服务器是否允许该实际请求,所以这一次的OPTION请求称为”预检请求“。服务器成功响应预检请求后,才会发送真正的请求,并且携带真实数据。满足任意一个条件,都需要进行预检请求:- 请求方式为GET,POST,HEAD之外的请求method类型。- 请求头中包含自定义头部字段- 向服务器发送application/json格式的数据。
2.JSONP
: 浏览器通过 script 标签的src属性,请求服务器上的数据,同时,服务器返回一个函数的调用。
- JSONP不属于真正的Ajax请求,因为没有使用XMLHttpRequest这个对象。
- JSONP仅支持GET请求,不支持POST、PUT、DELETE等请求。
必须在配置cors中间件之前,配置jsonp的接口。
实现JSONP接口步骤:1. 获取客户端发送过来的回调函数名字。2. 得到要通过JSONP形式发送给客户端的数据。3. 根据前两步得到的数据,拼接出一个函数调用的字符串。4. 上一步拼接的字符串,响应给客户端<script>标签进行解析执行
app.get('/api/jsonp', (req, res) => {// 得到函数名称const fullName = req.query.callback// 定义要发送给客户端的数据const data = {name : 'ly', age : 18}// 拼接一个函数的调用const scriptStr = `${fullName}(${JSON.stringify(data)})`// 拼接的字符串, 响应给客户端res.send(scriptStr)
})
相关文章:
express框架搭建后台服务
express 1. 使用express创建web服务器:2. 中间件中间件分类: 3.解决跨域问题:1. CORS2.JSONP 1. 使用express创建web服务器: 1. 导入express2. 创建web服务器3. 启动web服务器// 1. 导入express const express require(express)/…...
信息学奥赛一本通2067详解+代码
题目:http://ybt.ssoier.cn:8088/show_source.php?runid24484837 2067:【例2.5】圆 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 98334 通过数: 53637 【题目描述】 输入半径r,输出圆的直径、周长、面积,数与数…...
Java大数据hadoop2.9.2搭建伪分布式yarn资源管理器
1、修改配置文件 cd /usr/local/hadoop/etc/hadoop cp ./mapred-site.xml.template ./mapred-site.xml vi mapred-site.xml <configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> &l…...
3D Gaussian Splatting复现
最近3D Gaussian Splatting很火,网上有很多复现过程,大部分都是在Windows上的。Linux上配置环境会方便简单一点,这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译,建议看这个up主的视频配置,讲解的很细…...
tf-idf +逻辑回归来识别垃圾文本
引入相关包 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, auc, roc_auc_score import joblib import os import pandas as pd from sklearn.model_select…...
Oracle - 数据库的实例、表空间、用户、表之间关系
Oracle是一种广泛使用的关系型数据库管理系统,它具有高性能、高可靠性、高安全性等特点。1Oracle数据库的结构和组成是一个复杂而又有趣的话题,本文将介绍Oracle数据库的四个基本概念:数据库、实例、表空间和用户,以及它们之间的关…...
Java面试项目推荐,异构数据源数据流转服务DatalinkX
前言 作为一个年迈的夹娃练习生,每次到了春招秋招面试实习生时都能看到一批简历,十个简历里得有七八个是写商城或者外卖项目。 不由得想到了我大四那会,由于没有啥项目经验,又想借一个质量高点的项目通过简历初筛,就…...
一、Vue3组合式基础[ref、reactive]
一、ref 解释:ref是Vue3通过ES6的Proxy实现的响应式数据,其与基本的js类型不同,其为响应式数据,值得注意的是,reactive可以算是ref的子集,ref一般用来处理js的基本数据类型如整型、字符型等等(也可以用来处…...
unity网页远程手机游戏Inspector面板proxima
https://www.unityproxima.com/docs...
聊聊spring事务12种场景,太坑了
前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数…...
mysql 数据查重与查重分页
起因是公司的crm录入不规范,有重复数据。 之后考虑到需要手动处理,首先需要自动找出重复的数据 查重要求: 存在多个不允许重复的字段,任一字段重复,则判断为同一个客户。划分到同一重复组中。 查重sql如下 SELECT C…...
微服务(12)
目录 56.k8s是怎么进行服务注册的? 57.k8s集群外流量怎么访问Pod? 58.k8s数据持久化的方式有哪些? 59.Relica Set和Replication Controller之间有什么区别? 60.什么是Service Mesh(服务网格)&#x…...
iOS实时查看App运行日志
目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 📝 摘要: 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具,我们可以连接手机并方便地筛选我们自己App的日志。 Ǵ…...
【计算机毕业设计】SSM健身房管理系统
项目介绍 本项目为后台管理系统,主要分为管理员与用户两种角色; 登录页面,管理员首页,会员增删改查,教练增删改查,运动器材管理等功能。 用户角色包含以下功能: 用户登录页面,用户首页,选择课程,选择教练等功能。 环境需要 1.运行环境&a…...
嵌入式Linux之MX6ULL裸机开发学习笔记(IMX启动方式-启动设备的选择)
一,硬件启动方式选择 1.启动方式的选择 6ull支持多种启动方式。 比如可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动。 6ull是怎么支持多种外置flash启动程序的。 1.启动方式选择: BOOT_MODE0 and BOOT_MODE1,这两个是两个IO来控制的,…...
K8S Ingress-Nginx导出TCP端口
ingress-nginx导出TCP端口 Exposing TCP and UDP services - Ingress-Nginx Controllerhttps://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md helm upgrade ingress-nginx导出redis 6379端口(这种方式最简单&…...
索引类型-哈希索引
一. 前言 前面我们简单介绍了数据库的B-Tree索引,下面我们介绍另一种索引类型-哈希索引。 二. 哈希索引的简介 哈希索引(hash index) 基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有索引列计算一个…...
uniapp中组件库的Textarea 文本域的丰富使用方法
目录 #平台差异说明 #基本使用 #字数统计 #自动增高 #禁用状态 #下划线模式 #格式化处理 API #List Props #Methods #List Events 文本域此组件满足了可能出现的表单信息补充,编辑等实际逻辑的功能,内置了字数校验等 注意: 由于…...
LLM、AGI、多模态AI 篇三:微调模型
文章目录 系列LLM的几个应用层次Lora技术其他微调技术FreezeP-TuningQLoRA指令设计构建高质量的数据微调步骤系列 LLM、AGI、多模态AI 篇一:开源大语言模型简记 LLM、AGI、多模态AI 篇二:Prompt编写技巧 LLM、AGI、多模态AI 篇三...
IPC之十二:使用libdbus在D-Bus上异步发送/接收信号的实例
IPC 是 Linux 编程中一个重要的概念,IPC 有多种方式,本 IPC 系列文章的前十篇介绍了几乎所有的常用的 IPC 方法,每种方法都给出了具体实例,前面的文章里介绍了 D-Bus 的基本概念以及调用远程方法的实例,本文介绍 D-Bus…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
