当前位置: 首页 > news >正文

node.js基础学习-express框架-路由及中间件(十)

一、前言

Express 是一个简洁、灵活的 Node.js Web 应用框架。它基于 Node.js 的内置 HTTP 模块构建,提供了一系列用于构建 Web 应用程序和 API 的功能,使开发者能够更高效地处理 HTTP 请求和响应,专注于业务逻辑的实现。
其特点包括简单易用、中间件机制丰富、路由系统灵活等。通过使用 Express,可以快速搭建服务器,处理不同类型的请求,如网页渲染、数据接口提供等多种功能。

二、路由

1. 基本的路由格式

一个基本的 Express 路由由 HTTP 方法(如app.getapp.post等)、路径(如'/''/about'等)和一个或多个回调函数组成。例如:

app.get('/', (req, res) => {res.send('Hello World!');
});

这里app.get表示处理 HTTP GET 请求,'/'是请求路径,(req, res) => {... }是回调函数。req代表请求对象,包含了请求的相关信息,如请求头、请求参数等;res代表响应对象,用于发送响应给客户端,如res.send方法用于发送响应内容。

2. 路径匹配

  • 静态路径匹配:如app.get('/about', (req, res) => {... });,只有当请求路径完全匹配/about时,这个路由才会被触发。

  • 动态路径匹配:可以使用参数来创建动态路由。例如,app.get('/users/:id', (req, res) => { const id = req.params.id; res.send(User ${id}); });:id是一个动态参数,当请求路径类似/users/1/users/2等时,req.params.id可以获取到相应的参数值,用于根据不同的用户 ID 等动态信息返回不同的响应。

  • 路径参数的多种匹配方式

  • 可选参数:在路径中使用?来表示可选部分。例如app.get('ab?cd', (req, res) => {... });可以匹配ab或者abcd这样的路径。

  • 通配符匹配:使用*来表示匹配任意字符序列。例如app.get('ab*cd', (req, res) => {... });可以匹配ab后面跟着任意字符再接着cd的路径,如abxyzcd等。

  • 正则表达式匹配:可以直接在路径中使用正则表达式。例如app.get('/ab+cd', (req, res) => {... });匹配ab后面至少有一个字符再接着cd的路径,符合正则表达式ab+cd的模式。

3. 路由方法(HTTP方法)

Express 支持多种 HTTP 方法来定义路由,常见的有:

  • GET 请求:用于从服务器获取数据。例如,获取网页内容、查询用户信息等场景。如app.get('/books', (req, res) => { // 查询书籍信息并返回 });
  • POST 请求:通常用于向服务器提交数据,如提交表单数据、上传文件等。例如,app.post('/login', (req, res) => { // 处理用户登录信息提交 });
  • PUT 请求:用于更新服务器上的数据。例如,更新用户信息、修改文章内容等场景。app.put('/users/:id', (req, res) => { // 根据用户ID更新用户信息 });
  • DELETE 请求:用于删除服务器上的数据。比如删除用户记录、删除文件等。app.delete('/products/:id', (req, res) => { // 根据产品ID删除产品信息 });

三、 Express 中间件

中间件是在请求和响应周期中被调用的函数,它可以访问请求对象(req)、响应对象(res)和应用程序的请求 - 响应循环中的下一个中间件(next)。中间件可以执行各种任务,如日志记录、身份验证、数据预处理等,然后可以选择将请求传递给下一个中间件或者路由处理函数。

1. 中间件的使用方式

单个中间件:在路由处理函数中,可以有一个或多个中间件。例如:

app.get('/home', (req, res, next) => {console.log('This is a middleware');next();
}, (req, res) => {res.send('This is the home page');
});

这里第一个函数是中间件,它先打印一条日志,然后调用next()将控制权传递给下一个函数(这里是路由处理函数),用于发送响应。如果不调用next()函数,下一个中间件将不会被执行。

中间件数组:也可以将多个中间件组合成一个数组来使用。例如:

const func1 = (req, res, next) => {console.log('This is a middleware 1');next();
};
const func2 = (req, res, next) => {console.log('This is a middleware 2');next();
};
const func3 = (req, res, next) => {console.log('This is a middleware 3');next();
};
app.get('/list', [func1, func2, func3], (req, res) => {res.send('This is the list page');
});

当请求/list路径时,会依次执行func1func2func3这三个中间件,最后执行路由处理函数来发送响应。

2. 中间件之间的传值

中间件可以通过reqres对象在中间件之间传递值。例如:

const func4 = (req, res, next) => {req.name = 'John';res.age = 33;next();
};
const func5 = (req, res, next) => {const name = req.name;const age = res.age;res.send(`<h1>Hello ${name}, you are ${age} years old!</h1>`);
};
app.get('/hello', [func4, func5], (req, res) => {
});

func4中间件中,通过req.nameres.age设置了值,然后在func5中间件中可以获取这些值来生成响应。

3. 不同类型的中间件

3.1 应用级中间件

通过app.use()方法来添加应用级中间件,它可以应用于整个应用程序或者特定的路径。如果没有指定路径,中间件会应用于所有的请求路径。例如:

const express = require('express');
const app = express();
app.use((req, res, next) => {console.log('This middleware is called for every request');next();
});
app.get('/hello', (req, res) => {res.send('Hello World');
});
app.listen(3000, () => {console.log('Server is running on port 3000');
});

在这个例子中,定义的中间件会在每个请求到达服务器时被调用,它先打印一条日志,然后通过next()函数将请求传递给下一个中间件或者路由处理函数。

3.2 特定路径的应用级中间件

可以指定中间件应用的路径,这样中间件只会对匹配该路径及其子路径的请求起作用。例如:

app.use('/admin', (req, res, next) => {console.log('This middleware is for /admin and its sub - paths');// 可以在这里进行权限验证等操作next();
});
app.get('/admin/dashboard', (req, res) => {res.send('Admin Dashboard');
});

当请求/admin路径或者以/admin开头的子路径(如/admin/dashboard)时,中间件会被调用。这对于对特定模块或功能进行统一的预处理(如权限验证)非常有用。

3.3 路由中间件

路由中间件和应用级中间件类似,也是通过app.use()在特定路由路径下注册,在路由处理函数之前执行,用于对该路由的请求进行预处理等操作。例如:

app.use('/api/users', (req, res, next) => {console.log('This is a route - level middleware for /api/users');// 可以在这里进行用户相关的预处理,如验证用户是否存在等next();
});
app.get('/api/users', (req, res) => {res.send('List of users');
});

这里的路由中间件会在处理/api/users路由的请求之前被调用,用于对用户相关的请求进行预处理。

3.4 错误处理中间件

错误处理中间件用于捕获和处理在路由处理函数或其他中间件中抛出的错误。它的函数签名与普通中间件略有不同,有四个参数(err, req, res, next),其中err参数用于接收错误对象。错误处理中间件应该放在所有其他中间件和路由定义之后,这样才能捕获它们抛出的错误。例如:

app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Something went wrong!');
});
app.get('/error - route', (req, res, next) => {const error = new Error('This is a test error');next(error);
});

在这个例子中,当请求/error - route时,会在路由处理函数中创建一个错误对象并通过next(error)将错误传递给错误处理中间件。错误处理中间件会在控制台打印错误栈信息,然后向客户端返回一个状态码为500(服务器内部错误)的响应,消息为Something went wrong!

3.5 内置中间件

**express.json():**用于解析application/json格式的请求体。在处理 POST 或 PUT 请求,且请求体数据为 JSON 格式时非常有用。例如:

app.use(express.json());
app.post('/data', (req, res) => {const data = req.body;// 处理接收到的JSON数据res.send('Data received');
});

当客户端发送一个application/json格式的 POST 请求到/data路径时,express.json()中间件会自动将请求体中的 JSON 数据解析为 JavaScript 对象,并挂载到req.body上,方便在路由处理函数中使用。

**express.urlencoded({ extended: false }):**用于解析application/x -www-form-urlencoded格式的请求体。通常用于处理 HTML 表单提交的数据。例如:

app.use(express.urlencoded({ extended: false }));
app.post('/form-data', (req, res) => {const formData = req.body;// 处理接收到的表单数据res.send('Form data received');
});

username=jun&password=123456这种格式的数据解析

3.6 第三方中间件

**morgan:**用于日志记录,它可以记录每个请求的详细信息,如请求方法、请求路径、响应状态码等。例如:

const morgan = require('morgan');
app.use(morgan('combined'));

这里morgan('combined')是一种日志格式选项,它会记录详细的请求信息。morgan还有其他日志格式,如'dev'(适合开发环境)、'common'等,开发者可以根据实际需求选择。

**cors:**用于解决跨域资源共享问题。例如:

const cors = require('cors');
app.use(cors({origin: 'http://example.com',methods: ['GET', 'POST'],
}));

这个配置允许来自http://example.com的请求使用GETPOST方法进行跨域访问。可以根据具体的业务场景调整origin(允许的源)、methods(允许的请求方法)等参数来满足跨域需求。

四、 模块化的路由中间件

express.Router是 Express 框架中的一个重要组件,它提供了一种模块化的方式来定义路由。使用Router可以将路由分组并封装到独立的模块中,这有助于组织大型应用程序的路由结构,使代码更加清晰、易于维护和扩展。

1. 创建和使用express.Router实例

创建实例:首先,需要创建一个Router实例。例如:

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

定义路由:在Router实例上可以像在主app对象上一样定义各种 HTTP 方法的路由。例如:

router.get('/', (req, res) => {res.send('This is the root of the sub - router');
});
router.post('/data', (req, res) => {const data = req.body;res.send(`Received data: ${data}`);
});

挂载到主应用:创建并定义好Router的路由后,需要将其挂载到主 Express 应用上。例如:

const app = express();
app.use('/api', router);

这里将router挂载到/api路径下,这意味着router中定义的所有路由实际上是相对于/api路径的。例如,router中的'/'路由实际上对应的是/api/路径,'/data'路由对应的是/api/data路径。

2. 路由模块化的优势

  • 代码结构清晰:通过将相关的路由分组到不同的Router模块中,可以将一个大型应用的路由按照功能模块(如用户管理、产品管理、订单管理等)进行划分。例如,在一个电商应用中,可以有一个userRouter用于处理用户相关的路由(注册、登录、获取用户信息等),一个productRouter用于处理产品相关的路由(产品列表、产品详情、添加产品等),这样的代码结构更易于理解和维护。
  • 复用性增强Router模块可以在不同的应用或者应用的不同部分复用。比如,一个通用的authRouter用于处理身份验证相关的路由(登录、验证 token 等),可以在多个不同的微服务或者应用模块中使用,只要它们遵循相同的接口和认证机制。
  • 团队协作便利:在团队开发中,不同的开发人员可以负责不同的Router模块,这样可以并行开发,减少代码冲突。例如,前端开发人员和后端开发人员可以分别开发与用户界面交互相关的路由和与数据库操作相关的路由,通过定义好的接口(如 API 路由)进行协作。

3. 中间件在express.Router中的使用

Router级别使用中间件:可以在Router实例上使用中间件,这些中间件会应用到该Router所定义的所有路由上。例如:

const loggerMiddleware = (req, res, next) => {console.log(`Received a request for ${req.url}`);next();
};
router.use(loggerMiddleware);

这里定义了一个日志记录中间件loggerMiddleware,并通过router.use()将其应用到router上。这样,router中所有的路由在被访问时,都会先执行这个日志记录中间件。

在特定路由中使用中间件:也可以在Router的特定路由中使用中间件。例如:

const authMiddleware = (req, res, next) => {const token = req.headers.authorization;if (!token) {return res.status(401).send('Unauthorized: No token provided');}// 验证token的其他逻辑next();
};
router.get('/protected - route', authMiddleware, (req, res) => {res.send('This is a protected route');
});

在这个例子中,authMiddleware中间件只应用于/protected - route这个特定的路由。当访问该路由时,会先执行中间件进行身份验证,只有验证通过后才会执行路由处理函数。

4. 嵌套express.Router实例

express.Router实例可以进行嵌套,以创建更复杂的路由层次结构。这在构建具有多层级关系的 API 或者应用程序时非常有用。例如,在一个具有用户组和用户的应用中,可以先有一个groupRouter用于处理用户组相关的路由,在groupRouter内部再嵌套一个userRouter用于处理每个用户组内用户相关的路由。

const groupRouter = express.Router();
const userRouter = express.Router();
// 定义用户组相关的路由
groupRouter.get('/', (req, res) => {res.send('List of groups');
});
groupRouter.post('/', (req, res) => {res.send('Create a new group');
});
// 在用户组路由中嵌套用户路由
userRouter.get('/', (req, res) => {res.send('List of users in the group');
});
userRouter.post('/', (req, res) => {res.send('Add a new user to the group');
});
groupRouter.use('/:groupId/users', userRouter);
const app = express();
app.use('/groups', groupRouter);

在这个例子中,userRouter被嵌套在groupRouter内部。groupRouter处理用户组的基本路由,如获取用户组列表和创建新用户组。userRouter处理用户组内用户的相关路由,如获取用户组内用户列表和添加新用户到用户组。通过groupRouter.use('/:groupId/users', userRouter)userRouter挂载到groupRouter/:groupId/users路径下,这样就创建了一个嵌套的路由结构。当请求/groups/1/users(假设1是用户组 ID)时,会先由groupRouter处理/groups/1部分的路由,然后将请求传递给userRouter处理/users部分的路由。

相关文章:

node.js基础学习-express框架-路由及中间件(十)

一、前言 Express 是一个简洁、灵活的 Node.js Web 应用框架。它基于 Node.js 的内置 HTTP 模块构建&#xff0c;提供了一系列用于构建 Web 应用程序和 API 的功能&#xff0c;使开发者能够更高效地处理 HTTP 请求和响应&#xff0c;专注于业务逻辑的实现。 其特点包括简单易用…...

书生浦语第四期--基础岛-第六关

文章目录 使用opencompass进行模型评价配置KEY环境变量以及API模型接口配置数据集进行评测开始评测测评结束 使用opencompass进行模型评价 配置KEY环境变量以及API模型接口 配置数据集进行评测 开始评测 期间可能遇到没有下载的包 例如&#xff0c;我遇到了&#xff1a; No m…...

flinkSql中累计窗口CUMULATE

eventTime package com.bigdata.day08;import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;public class _05_flinkSql_Cumulate_eventTime {/*** 累积窗口 eventTime* …...

Flutter项目初始化android版

1、本机系统环境 window11flutter sdk 版本flutter_windows_3.24.5-stable.zip (下载地址&#xff1a;https://docs.flutter.dev/get-started/install/windows/mobile)android studio 版本 Android Studio Giraffe | 2022.3.1vscode 2、VSCODE 配置flutter 安装flutter插件 …...

深度相机获取实时图像总结

问题详情&#xff1a;之前一直把曝光调整到50000&#xff0c;画面一直很流畅&#xff0c;知道领导要求将曝光改成500000时整个程序卡死了 问题解决&#xff1a; 首先怀疑是帧率太低的原因&#xff0c;控制变量后发现不是帧率的问题&#xff0c;看着代码很迷茫&#xff0c;领导…...

突击检查:Java面试之多线程并发篇(11)

前言 本来想着给自己放松一下&#xff0c;刷刷博客&#xff0c;突然被几道面试题难倒&#xff01;什么是多线程中的上下文切换&#xff1f;什么是Daemon线程&#xff1f;它有什么意义&#xff1f;乐观锁和悲观锁的理解及如何实现&#xff0c;有哪些实现方式&#xff1f;似乎有…...

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)

目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...

Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试

作者&#xff1a;来自 Elastic David Brimley, Jason Bryan, Gareth Ellis 及 Stewart Miles 深入了解 Elasticsearch Cloud Serverless 如何动态扩展以处理海量数据和复杂查询。我们探索其在实际条件下的性能&#xff0c;深入了解其可靠性、效率和可扩展性。 简介 Elastic Cl…...

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 输入输出示例 &#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…...

【蓝桥杯每日一题】扫雷

扫雷 知识点 2024-12-3 蓝桥杯每日一题 扫雷 dfs &#xff08;bfs也是可行的&#xff09; 题目大意 在一个二维平面上放置这N个炸雷&#xff0c;每个炸雷的信息有$(x_i,y_i,r_i) $&#xff0c;前两个是坐标信息&#xff0c;第三个是爆炸半径。然后会输入M个排雷火箭&#xff0…...

以nlp为例,区分BatchNorm、LayerNorm、GroupNorm、RMSNorm

以nlp中一个小批次数据&#xff0c;详细区分BatchNorm、LayerNorm、GroupNorm、RMSNorm。这几种归一化的不同。如下表格&#xff0c;从计算范围、统计量、计算复杂度以及应用场景等方面的差异给出。 方法计算范围统计量计算复杂度应用场景BatchNorm跨所有句子的同一维度使用批…...

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…...

在MySQL中执行sum case when报错:SUM does not exist

1. 报错 在pgsql中能正常运行的一段SQL在MySQL中运行的时候报错了&#xff1a; SELECT DATE( hr.handle_time ) AS statsDate,SUM ( CASE WHEN hma.app_type IN ( 2, 5 ) THEN ch_money ELSE 0 END ) AS aliPayAmt,SUM ( CASE WHEN hma.app_type IN ( 1, 4 ) THEN ch_money EL…...

SQL面试题——日期交叉问题 合并日期重叠的活动

日期交叉问题—合并日期重叠的活动 今天的需求背景和前面我们的一个面试题目的背景一样,只不过是具体的需求变了,可以先看一下我们之前的文章SQL面试题——日期交叉问题 计算活动的总天数 +------+----------+----------+ | id| stt| ett| +------+--------…...

科普文:一文搞懂Postman

1. 概叙 1.1 Postman简介 Postman是一款强大的接口测试工具&#xff0c;‌主要用于测试HTTP请求&#xff0c;‌支持各种HTTP请求方法&#xff0c;‌包括GET、‌POST、‌PUT、‌DELETE等&#xff0c;‌并且提供了丰富的功能来模拟和测试各种网络请求。‌ Postman官网上这样介…...

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…...

基于Pyhton的人脸识别(Python 3.12+face_recognition库)

使用Python进行人脸编码和比较 简介 在这个教程中&#xff0c;我们将学习如何使用Python和face_recognition库来加载图像、提取人脸编码&#xff0c;并比较两个人脸是否相似。face_recognition库是一个强大的工具&#xff0c;它基于dlib的深度学习模型&#xff0c;可以轻松实…...

Scala的模式匹配(2)

package hfdobject Test34_2 {//match case匹配元组//能根据元组元素的个数来匹配&#xff0c;不是一一精确的匹配值def main(args: Array[String]): Unit {val d1(1,2,3) // val d1(1,2,3,4) // val d1(1,2,3,4,5)val d:Anyd1 //d的类型是Anyd match {case (x,y,z)>…...

Java 初学者的第一个 SpringBoot 系统

Java 初学者的第一个 SpringBoot 系统 对编程初学者而言&#xff0c;都存在一个 “第一个系统” 的问题。有些学习者找不到自己的 “第一个系统”&#xff0c;他们即使再努力也没有办法了解完整的系统&#xff0c;即使他们把教科书里的所有程序都跑通了。但是&#xff0c;面对…...

java IO面试题

目录 Java IO设计上使用了什么设计模式&#xff1f; 你怎么理解同步IO和异步IO? 字节流和字符流的区别? Java 流量有多少种类型? 如何将一个 java 将对象序列化到文件中? 如何实现 java 序列化? Filter流是什么? Filter流有哪些可用? 如何实现对象克隆? BIO、…...

Chocolatey软件包管理工具处理MSI升级的原理与实践

Chocolatey软件包管理工具处理MSI升级的原理与实践 在Windows环境下&#xff0c;Chocolatey作为一款强大的包管理工具&#xff0c;其处理MSI&#xff08;Microsoft Installer&#xff09;格式软件包升级的机制值得深入探讨。本文将详细介绍Chocolatey如何处理MSI升级&#xff…...

Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。 Spr…...

【Git】

博文将不断学习补充 Git下载 将下载链接复制到迅雷中&#xff0c;快速下载 Git安装 保持默认&#xff0c;傻瓜安装即可。 注册Gitee码云&#xff0c;设置公钥 在Git Bash中输入 ssh-keygen -t ed25519 -C "Gitee SSH Key" 找到对应的公钥文件 复制公钥&#xff0c;添…...

HttpServletRequest

HttpServletRequest 类确实是一个封装了完整 HTTP 请求信息的对象&#xff0c;而 Spring MVC 提供了更简化的方式来自动映射请求路径、请求参数等信息到控制器方法中。你不必直接使用 HttpServletRequest 来处理大部分常见的请求内容&#xff0c;因为 Spring MVC 会为你自动处理…...

Apache HttpClient 4和5访问没有有效证书的HTTPS

本文将展示如何配置Apache HttpClient 4和5以支持“接受所有”SSL。 目标很简单——访问没有有效证书的HTTPS URL。 SSLPeerUnverifiedException 在未配置SSL的情况下&#xff0c;尝试消费一个HTTPS URL时会遇到以下测试失败&#xff1a; Test void whenHttpsUrlIsConsumed…...

做异端中的异端 -- Emacs裸奔之路7: 怀念Vim的好

组合键的瑕疵 从Vim切换成Emacs之后&#xff0c;有一明显的不适就是感受Emacs的按键很硬&#xff0c; Vim移动是使用一个按完成的&#xff0c;而Emacs是组合键。 如果向前移动一个字&#xff0c;Vim只要在ESC模式下按w&#xff0c;而Emacs是Alt-f. 特别是当你对键盘改键之后不…...

asp.net core过滤器应用

筛选器类型 授权筛选器 授权过滤器是过滤器管道的第一个被执行的过滤器&#xff0c;用于系统授权。一般不会编写自定义的授权过滤器&#xff0c;而是配置授权策略或编写自定义授权策略。简单举个例子。 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCo…...

VideoBooth: Diffusion-based Video Generation with Image Prompts

VideoBooth: Diffusion-based Video Generation with Image Prompts 概括 文章提出了一个视频生成模型VideoBooth&#xff0c;输入一张图片和一个文本提示词&#xff0c;即可输出保持图片中物体且符合文本提示词要求的视频。 方法 粗-细两阶段设计&#xff1a;1&#xff09;…...

面阵相机的使用和注意事项

引言 面阵相机&#xff08;Area Scan Camera&#xff09;是一种广泛应用于工业视觉、医学成像、安防监控以及科研领域的图像采集设备。与线扫相机不同&#xff0c;面阵相机的传感器包含多行像素&#xff08;例如1280x1024、1920x1080等&#xff09;&#xff0c;能够在一个曝光…...

人工智能与机器学习在智能扭矩系统中的应用

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。】 在当今科技飞速发展的时代&#xff0c;智能扭矩系统正经历着一场深刻的变革&#xff0c;而人工智能&#xff08;AI&#xff09;和机器学习算法的应用成为了推动这一变革的关键力量。 传统的扭矩…...

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo&#xff0c;完全适配HarmonyOS NEXT系统&#xff0c;实现了发送消息&#xff0c;添加好友等基础功能。代码开源&#xff0c;功能简洁&#xff0c;如果您有类似开发需求可以参考。 源码地址&#xff1a;https://github.c…...

【 AI技术赋能有限元分析与材料科学应用实践】Neo-Hookean 材料与深度学习结合的有限元分析

Neo-Hookean 材料模型是用于描述非线性弹性材料&#xff08;如软组织和橡胶等&#xff09;的经典模型&#xff0c;特别适用于大变形问题。其基本思想是通过应变能密度函数来描述材料的弹性行为。在该模型中&#xff0c;材料的应力-应变关系不仅依赖于应变能&#xff0c;还通过变…...

Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二

1.先导入数据到origin 2.导入文件的时候注意&#xff1a;名字短的这个是&#xff0c;或者你打开后看哪个里面有800&#xff0c;因为我的激光重频是1.25Hz&#xff08;应该是&#xff0c;不太确定单位是KHz还是MHz&#xff09;&#xff0c;所以对应的时间是800s。 3.选中两列直接…...

LeetCode Hot100 51~60

图论51. 岛屿问题52. 腐烂的橘子53. 课程表54. 前缀树55. 全排列56. 子集57. 电话号码58. 组合总和59. 括号生成60. 单词搜索 图论 51. 岛屿问题 经典洪水问题算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int nr grid.size…...

第一节:ORIN NX介绍与基于sdkmanager的镜像烧录(包含ubuntu文件系统/CUDA/OpenCV/cudnn/TensorRT)

ORIN NX技术参数 Orin NX版本对比 如上图所示,ORIN NX官方发布的版本有两个版本一个版本是70TOPS算力,DDR为8GB的版本低配版本,一个是100TOPS算法,DDR为16GB的高配版本。 Orin NX的外设框图 两个版本除了GPU和DDR的差距外,外设基本上没有区别,丰富的外设接口,后续开发…...

使用Pygame创建一个简单的消消乐游戏

消消乐游戏是一种经典的益智游戏&#xff0c;玩家通过交换相邻的方块来形成三个或更多相同颜色的连续方块&#xff0c;从而消除它们。本文将介绍如何使用Python的Pygame库来创建一个简单的消消乐游戏。 准备工作 在开始之前&#xff0c;请确保已安装Pygame库。可以通过以下命…...

node.js基础学习-JWT登录鉴权(十四)

一、前言 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之间安全地传输信息。它本质上是一个字符串&#xff0c;由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&am…...

AbutionGraph-时序向量图谱数据库-快速安装部署

运行环境 1&#xff09;操作系统 最好是使用CentOS7或者Ubuntu18以上系统&#xff0c;不满足的话请升级系统内核gcc版本至8以上版本。 支持所有国产主流操作系统银河麒麟、统信OS、深度等等&#xff0c;均做过兼容性测试&#xff1b; 2&#xff09;CPU 为确保数据库每个进…...

翻译质量差对电子课程用户体验的影响

电子学习改变了教育交付方式&#xff0c;使全球不同受众更容易获得课程。然而&#xff0c;随着这种学习模式的发展&#xff0c;对周到地本地化和翻译的需求也在增长。如果做得好&#xff0c;翻译可以弥合文化和语言分歧&#xff0c;创造无缝和包容的学习体验。然而&#xff0c;…...

PS的功能学习(修复、画笔)

混合器画笔工具 就像&#xff0c;电子毛笔 关键功能有两个&#xff0c;自带一个混合器色板 清理画笔是全清&#xff0c;换一支新的毛笔&#xff0c;执行完之后在判断是否载入画笔 载入画笔就是把前景色上的颜色进行叠加处理&#xff0c;重新混入当前的混合色 &#xff08;…...

Android 使用 Canvas 和 Paint 实现圆形图片

学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …...

vxe-table 键盘操作,设置按键编辑方式,支持覆盖方式与追加方式

vxe-table 全键盘操作&#xff0c;按键编辑方式设置&#xff0c;覆盖方式与追加方式&#xff1b; 通过 keyboard-config.editMode 设置按键编辑方式&#xff1b;支持覆盖方式编辑和追加方式编辑 安装 npm install vxe-pc-ui4.3.15 vxe-table4.9.15// ... import VxeUI from v…...

BUUCTF Pwn [HarekazeCTF2019]baby_rop 题解

下载 checksec 64位 用IDA64打开 定位main函数 栈溢出漏洞 SHIFTF12的字符串看到了binsh 以及函数窗口有system 因为是64位 找到rdi传参和ret栈平衡 构造exp&#xff1a; from pwn import *#p process(./babyrop) p remote("node5.buuoj.cn", 27869)addr_prr 0…...

什么是封装性?C++ 中如何实现封装?封装性的好处是什么?

一、引言 在面向对象编程中&#xff0c;封装性是一个重要的概念。封装可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性、可扩展性和安全性。本文将详细介绍什么是封装性&#xff0c;C 中如何实现封装以及封装性的好处。 二、什么是封装性&#xff1f; 封装…...

【MySQL】[42000][1071] Specified key was too long; max key length is 3072 bytes

问题描述 创建表时发生错误。 create table if not exists tbl_user(id int unsigned auto_increment comment 用户IDprimary key,username varchar(1023) not null comment 用户名,password varchar(1023) default 123456 …...

人工智能驱动的骗局会模仿熟悉的声音

由于人工智能技术的进步&#xff0c;各种现代骗局变得越来越复杂。 这些骗局现在包括人工智能驱动的网络钓鱼技术&#xff0c;即使用人工智能模仿家人或朋友的声音和视频。 诈骗者使用来自社交媒体的内容来制作深度伪造内容&#xff0c;要求提供金钱或个人信息。个人应该通过…...

实数与复数频谱掩蔽在音频分离中的应用

使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中&#xff0c;通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型&#xff1a;实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…...

C++算法练习-day62——491.非递减子序列

题目来源&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目思路分析 这个问题要求找出数组 nums 中的所有非严格递增子序列&#xff0c;其中每个子序列至少包含两个元素。非严格递增子序列意味着子序列中的元素可以相等&#xff0c;但不允许递减。 为了解决这个问…...

golang实现单例日志对象

原文地址&#xff1a;golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包&#xff0c;通过设置和修改都能实现日志轮转和自定义日志格式。例如&#xff1a;log、zap、golog、slog、log4go 等等。 …...