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

【MCP Node.js SDK 全栈进阶指南】中级篇(5):MCP客户端高级开发

在前面的系列文章中,我们主要关注了服务器端的开发,包括基础服务器构建、资源设计、身份验证与授权以及错误处理与日志系统。本篇文章将转向客户端,探讨MCP TypeScript-SDK在客户端开发中的高级应用。

客户端开发是MCP应用的重要组成部分,它连接了用户与服务器,提供了交互界面和功能入口。一个设计良好的客户端不仅能提供流畅的用户体验,还能确保与服务器的高效通信和数据处理。在本文中,我们将深入探讨MCP客户端API的高级用法、自定义客户端封装、跨平台客户端设计以及客户端性能优化等关键主题。

一、客户端API高级用法

MCP TypeScript-SDK提供了强大而灵活的客户端API,使开发者能够与服务器进行高效交互。让我们从基础开始,逐步深入探索其高级用法。

1.1 客户端初始化与配置

在使用MCP客户端之前,需要正确初始化并配置相关参数。以下是一个完整的客户端初始化示例:

import { McpClient, HttpTransport } from '@modelcontextprotocol/sdk';// 基本客户端初始化
const client = new McpClient({// 客户端唯一标识符clientId: 'my-mcp-client-v1',// 传输层配置transport: new HttpTransport({baseUrl: 'https://api.example.com/mcp',// 自定义请求头headers: {'X-Client-Version': '1.0.0',},// 身份验证令牌(可选)authToken: process.env.MCP_AUTH_TOKEN,// 请求超时(毫秒)timeout: 30000,// 重试配置retry: {maxRetries: 3,initialDelay: 300,maxDelay: 5000,factor: 2,retryOnStatusCodes: [408, 429, 500, 502, 503, 504],},}),// 高级配置项options: {// 是否启用流式响应enableStreaming: true,// 扩展/插件配置plugins: [// 例如:日志插件createLoggerPlugin({level: 'info',logRequests: true,logResponses: true,}),// 例如:遥测插件createTelemetryPlugin({endpoint: 'https://telemetry.example.com',sampleRate: 0.1, // 采样率10%}),],// 默认请求超时(毫秒)defaultTimeout: 60000,// 保持活动连接设置keepAlive: true,keepAliveMsecs: 30000,// 自定义序列化/反序列化serializer: {serialize: (data) => JSON.stringify(data),deserialize: (data) => JSON.parse(data),},},
});// 客户端初始化完成后的操作
await client.initialize();// 当不再需要客户端时,应正确关闭连接
process.on('SIGTERM', async () => {await client.shutdown();
});

这个示例涵盖了MCP客户端初始化的多个方面,包括传输层配置、身份验证、重试策略、插件系统和序列化选项等。根据项目需求,你可以调整这些参数以获得最佳性能和用户体验。

1.2 资源操作的高级技巧

MCP客户端提供了多种方式与服务器端资源进行交互。以下是一些高级用法示例:

// 1. 批量获取资源
const userResults = await client.resources.getMany('users', {ids: ['user-1', 'user-2', 'user-3'],include: ['profile', 'preferences'], // 包含相关资源
});// 处理批量结果
for (const user of userResults.successful) {console.log(`成功获取用户: ${user.id}`);
}for (const failure of userResults.failed) {console.error(`获取用户失败: ${failure.id}, 错误: ${failure.error.message}`);
}// 2. 使用查询参数过滤资源
const activeUsers = await client.resources.query('users', {filter: {status: 'active',lastLogin: { $gt: '2023-01-01' },role: { $in: ['admin', 'editor'] },},sort: { lastLogin: 'desc' },limit: 50,page: 1,fields: ['id', 'name', 'email', 'role'], // 字段投影
});// 3. 递归获取资源树
const projectWithAllAssets = await client.resources.get('projects', 'project-1', {depth: 3, // 递归深度include: ['tasks', 'assets', 'members'],fields: { // 每种资源类型的字段投影projects: ['id', 'name', 'description', 'createdAt'],tasks: ['id', 'title', 'status', 'assignee'],assets: ['id', 'name', 'type', 'url'],members: ['id', 'name', 'role'],},
});// 4. 条件资源更新
const updateResult = await client.resources.update('documents', 'doc-1', {title: '更新的文档标题',content: '更新的内容...',
}, {// 仅当版本匹配时更新(乐观并发控制)ifMatch: { version: 5 },// 或者使用条件表达式ifCondition: {lastModifiedBy: currentUser.id, // 仅当最后修改者是当前用户status: { $ne: 'locked' }, // 且状态不是锁定的},
});// 5. 部分更新(补丁操作)
const patchResult = await client.resources.patch('users', 'user-1', [{ op: 'replace', path: '/email', value: 'new.email@example.com' },{ op: 'add', path: '/tags', value: 'premium' },{ op: 'remove', path: '/temporaryFlags/newUser' },
]);// 6. 批量操作
const batchResults = await client.batch([{ type: 'get', resource: 'users', id: 'user-1',params: { fields: ['id', 'name', 'email'] }},{ type: 'update', resource: 'documents', id: 'doc-1',data: { status: 'published' }},{ type: 'create', resource: 'comments',data: { documentId: 'doc-1',content: '这是一条新评论',author: 'user-1'}},
]);// 处理批量操作结果
batchResults.forEach((result, index) => {if (result.status === 'fulfilled') {console.log(`操作 ${index} 成功:`, result.value);} else {console.error(`操作 ${index} 失败:`, result.reason);}
});// 7. 使用自定义操作
const documentStats = await client.resources.execute('documents', 'doc-1', 'calculateStatistics', {includeWordCount: true,includeReadingTime: true,
});// 8. 订阅资源变更
const unsubscribe = await client.resources.subscribe('projects', 'project-1', (update) => {console.log(`项目更新:`, update);if (update.type === 'deleted') {// 处理资源被删除的情况unsubscribe(); // 取消订阅} else if (update.type === 'updated') {// 处理资源更新updateUI(update.data);}
});

这些示例展示了MCP客户端API在处理资源时的高级用法,包括批量操作、条件更新、部分更新、自定义操作和资源订阅等。通过这些高级API,你可以构建更加灵活和高效的客户端应用程序。

1.3 工具调用与流式处理

MCP客户端支持调用服务器定义的工具,并能够处理流式响应。以下是一些高级用法:

// 1. 基本工具调用
const translationResult = await client.tools.execute('translateText', {text: '你好,世界!',sourceLanguage: 'zh',targetLanguage: 'en',
});console.log(`翻译结果: ${translationResult.translatedText}`);// 2. 流式工具调用
const stream = await client.tools.executeStreaming('generateContent', {prompt: '请写一篇关于人工智能的短文',maxLength: 500,temperature: 0.7,
});// 处理流式响应
for await (const chunk of stream) {if (chunk.type === 'content') {// 处理内容块console.log(chunk.content);updateUI(chunk.content);} else if (chunk.type === 'metadata') {// 处理元数据console.log('元数据:', chunk.data);} else if (chunk.type === 'error') {// 处理错误console.error('流处理错误:', chunk.error);break;}
}// 3. 取消长时间运行的工具调用
const abortController = new AbortController();
const { signal } = abortController;// 设置5秒后自动取消
setTimeout(() => {abortController.abort('操作超时');
}, 5000);try {const result = await client.tools.execute('processLargeDataset', {datasetId: 'dataset-123',operations: ['analyze', 'transform', 'summarize'],}, { signal });console.log('处理完成:', result);
} catch (error) {if (error.name === 'AbortError') {console.log('操作已取消:', error.message);} else {console.error('处理错误:', error);}
}// 4. 并行工具调用
const [weatherResult, translationResult, newsResult] = await Promise.all([client.tools.execute('getWeather', { city: '北京' }),client.tools.execute('translateText', { text: '美好的一天',sourceLanguage: 'zh',targetLanguage: 'en'}),client.tools.execute('fetchNews', { category: 'technology', count: 5 }),
]);// 5. 工具调用重试与错误处理
try {const result = await client.tools.execute('unreliableOperation', { inputData: '测试数据'}, {retry: {maxRetries: 5,initialDelay: 500,maxDelay: 10000,factor: 2,retryCondition: (error) => {// 自定义重试条件return error.isTransient === true || error.code === 'RESOURCE_UNAVAILABLE';},onRetry: (error, attempt) => {console.log(`重试尝试 ${attempt} 失败:`, error);},},});console.log('操作成功:', result);
} catch (error) {console.error('所有重试都失败:', error);if (error.details?.suggestions) {console.log('建议的解决方案:', error.details.suggestions);}
}// 6. 复杂工具调用与上下文管理
const sessionContext = { sessionId: generateUniqueId() };const step1 = await client.tools.execute('startWorkflow', { workflowType: 'dataProcessing',initialData: { /* ... */ },
}, { context: sessionContext });// 使用来自第一步的数据和同一会话上下文
const step2 = await client.tools.execute('processWorkflowStep', {stepId: 'transform',workflowId: step1.workflowId,parameters: { /* ... */ },
}, { context: sessionContext });// 最后一步,仍使用同一会话上下文
const result = await client.tools.execute('completeWorkflow', {workflowId: step1.workflowId,finalizeOptions: { /* ... */ },
}, { context: sessionContext });

这些示例展示了MCP客户端在工具调用方面的高级用法,包括流式处理、取消操作、并行调用、重试策略和上下文管理等。通过这些高级功能,你可以构建更加强大和灵活的客户端应用程序。

1.4 会话与状态管理

MCP客户端提供了会话和状态管理功能,使你能够维护客户端与服务器之间的状态一致性。以下是一些高级用法:

// 1. 创建和管理会话
const session = await client.sessions.create({// 会话初始化参数userProfile: {id: 'user-123',name: '张三',role: 'editor',},preferences: {theme: 'dark',language: 'zh-CN',},// 会话持久化选项persistence: {type: 'localStorage', // 或 'sessionStorage', 'memory', 'custom'key: 'mcp-user-session',},
});// 获取会话信息
console.log(`会话ID: ${session.id}`);
console.log(`会话创建时间: ${session.createdAt}`);
console.log(`会话过期时间: ${session.expiresAt}`);// 更新会话数据
await session.update({preferences: {theme: 'light', // 更新主题},
});// 2. 状态同步和冲突解决
const documentState = await client.state.sync('document', 'doc-123', {// 本地状态localState: {content: '文档内容...',version: 5,lastEditedAt: new Date().toISOString(),},// 冲突解决策略conflictResolution: {strategy: 'lastWriteWins', // 或 'serverWins', 'clientWins', 'merge', 'manual'// 自定义合并函数(当strategy为'merge'时使用)merge: (clientState, serverState) => {return {...serverState,content: clientState.content, // 使用客户端内容version: Math.max(clientState.version, serverState.version) + 1,lastEditedAt: new Date().toISOString(),mergedAt: new Date().toISOString(),};},// 手动冲突解决回调(当strategy为'manual'时使用)onConflict: async (clientState, serverState) => {// 显示冲突解决UIconst resolution = await showConflictResolutionDialog(clientState, serverState);return resolution;},},// 差异计算选项(用于优化网络传输)diff: {enabled: true,algorithm: 'jsonpatch', // 或 'custom'// 自定义差异计算(当algorithm为'custom'时使用)calculate: (oldState, newState) => {// 计算状态差异// 返回最小差异表示},// 自定义差异应用(当algorithm为'custom'时使用)apply: (state, diff) => {// 应用差异到状态// 返回新状态},},
});// 3. 实时状态订阅
const unsubscribe = await client.state.subscribe('chatRoom', 'room-456', {// 初始同步选项initialSync: true,// 状态更新处理onUpdate: (newState, previousState) => {console.log('聊天室状态更新:', newState);updateChatUI(newState);},// 错误处理onError: (error) => {console.error('状态订阅错误:', error);reconnectIfNeeded(error);},// 差异处理(可选,用于优化)processDiff: true,
});// 4. 离线状态管理与同步
const offlineManager = client.offline.createManager({states: ['documents', 'tasks', 'contacts'],// 存储配置storage: {type: 'indexedDB', // 或 'localStorage', 'custom'databaseName: 'mcp-offline-data',version: 1,},// 同步配置sync: {// 自动同步间隔(毫秒)interval: 60000, // 1分钟// 同步触发器triggers: {onNetworkReconnect: true,onAppForeground: true,onStateChange: true,},// 同步优先级priorities: {'documents': 10, // 高优先级'tasks': 5,     // 中优先级'contacts': 1,  // 低优先级},// 冲突解决策略(可以针对不同状态类型设置不同策略)conflictResolution: {'documents': 'merge','tasks': 'serverWins','contacts': 'lastWriteWins',},},// 离线操作队列operations: {// 最大队列长度maxQueueLength: 1000,// 操作压缩(合并多个操作)compress: true,// 操作优先级prioritize: (op1, op2) => {// 返回优先级比较结果return op1.priority - op2.priority;},},
});// 手动触发同步
await offlineManager.syncNow({states: ['documents'], // 只同步文档force: true, // 强制同步,忽略时间间隔限制
});// 获取同步状态
const syncStatus = offlineManager.getSyncStatus();
console.log('上次同步时间:', syncStatus.lastSyncTime);
console.log('同步进度:', syncStatus.syncProgress);
console.log('待处理操作数:', syncStatus.pendingOperations);// 注册同步事件监听器
offlineManager.events.on('syncStart', () => {showSyncIndicator();
});offlineManager.events.on('syncComplete', (result) => {hideSyncIndicator();if (result.success) {showSuccessNotification('同步完成');} else {showErrorNotification('同步失败', result.error);}
});

这些示例展示了MCP客户端在会话和状态管理方面的高级用法,包括会话创建与管理、状态同步与冲突解决、实时状态订阅以及离线状态管理等。通过这些功能,你可以构建具有强大状态管理能力的客户端应用程序,为用户提供流畅的体验,即使在网络不稳定的情况下也能正常工作。

二、自定义客户端封装

在实际应用中,MCP默认的客户端API虽然功能强大,但有时需要针对特定业务需求进行定制化封装,以提供更加简洁和语义化的API。本章将探讨如何基于MCP SDK创建自定义客户端封装。

2.1 领域特定客户端设计

当你的应用有特定的业务领域时,创建领域特定的客户端可以极大提高开发效率和代码可读性。以下是一个内容管理系统(CMS)的客户端封装示例:

import { McpClient, HttpTransport } from '@modelcontextprotocol/sdk';/*** CMS客户端类,特定于内容管理系统领域*/
export class CmsClient {private client: McpClient;constructor(options: {apiUrl: string;authToken?: string;timeout?: number;}) {// 初始化底层MCP客户端this.client = new McpClient({clientId: 'cms-client-v1',transport: new HttpTransport({baseUrl: options.apiUrl,authToken: options.authToken,timeout: options.timeout || 30000,}),});}/*** 初始化客户端*/async initialize(): Promise<void> {await this.client.initialize();}/*** 关闭客户端连接*/async shutdown(): Promise<void> {await this.client.shutdown();}/*** 文章相关操作*/articles = {/*** 获取文章列表*/list: async (options?: {page?: numbe

相关文章:

【MCP Node.js SDK 全栈进阶指南】中级篇(5):MCP客户端高级开发

在前面的系列文章中,我们主要关注了服务器端的开发,包括基础服务器构建、资源设计、身份验证与授权以及错误处理与日志系统。本篇文章将转向客户端,探讨MCP TypeScript-SDK在客户端开发中的高级应用。 客户端开发是MCP应用的重要组成部分,它连接了用户与服务器,提供了交互…...

RASP技术在DevOps中的安全应用

随着新技术的不断演进&#xff0c;DevOps开发模式不断被利用&#xff0c;Web应用程序的开发相比过往更高效。随之而来的是保护这些应用程序同样面临着巨大挑战&#xff0c;黑客的攻击手段不断多变&#xff0c;而DevOps团队成员却不都是安全专家&#xff0c;难以保证应用程序的安…...

2025.04.26-饿了么春招笔试题-第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 魔法网格变换计数 问题描述 LYA是一位魔法研究学者,她正在研究一种特殊的魔法网格。这个网格有 n n n...

Linux线程与进程:探秘共享地址空间的并发实现与内

Linux系列 文章目录 Linux系列前言一、线程的概念二、线程与地址空间2.1 线程资源的分配2.2 虚拟地址到物理地址的转换 三 、线程VS进程总结 前言 在Linux操作系统中&#xff0c;线程作为CPU调度的基本单位&#xff0c;起着至关重要的作用。深入理解线程控制机制&#xff0c;是…...

数据结构手撕--【堆】

目录 ​编辑 定义结构体&#xff1a; 初始化&#xff1a; 插入数据&#xff1a; 删除&#xff1a; 取堆顶元素&#xff1a; 堆销毁&#xff1a; 判断堆是否为空&#xff1a; TopK问题&#xff1a; 堆其实是完全二叉树 物理结构&#xff1a;二叉树的层序遍历&#xff08…...

MySQL基本命令--系统+用户+表

前言&#xff1a;在当今数据驱动的时代&#xff0c;关系型数据库依然是构建信息系统的中坚力量&#xff0c;而MySQL作为开源领域中最广泛使用的数据库管理系统之一&#xff0c;以其高性能、稳定性和易用性赢得了开发者和企业的青睐。无论是在小型博客系统中承担数据存储职责&am…...

4.23-4.26学习总结 HTML—CSS常见标签和样式

页部导航栏&#xff1a; flex样式&#xff1a; 表单标签&#xff1a; &#xff08;25行是设置点击按钮&#xff09; 表单项标签&#xff1a; 搜索表单区域&#xff1a; 底部版权区域&#xff1a; 总结&#xff1a;...

使用Django框架表单

使用Django框架表单 文章目录 使用Django框架表单[toc]1.使用Form类构建表单2.表单字段与Widget控件 1.使用Form类构建表单 【创建项目和应用】 PS C:\Users\ls> cd E:\Python\ PS E:\Python> django-admin.exe startproject FormSite PS E:\Python> cd .\FormSite\…...

OpenCV第6课 图像处理之几何变换(缩放)

1.简述 图像几何变换又称为图像空间变换,它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。几何变换并不改变图像的像素值,只是在图像平面上进行像素的重新安排。 根据OpenCV函数的不同,本节课将映射关系划分为缩放、翻转、仿射变换、透视等。 2.缩放 2.1 函数…...

Python AI图像生成方案指南

1. 简介 AI图像生成是当前最热门的AI应用领域之一&#xff0c;Python提供了多种工具和库来实现这一功能。本指南将介绍几种主流的AI图像生成方案及其Python实现方法。 2. 主流AI图像生成技术 2.1 生成对抗网络(GANs) 原理&#xff1a;由生成器和判别器组成的对抗系统 特点&am…...

【C++】stack、queue和priority_queue的模拟实现

文章目录 前言一. stack1.1 stack的介绍1.2 stack的使用1.3 stack的模拟实现 二. queue2.1 queue的介绍2.2 queue的使用2.3 queue的模拟实现 三. deque3.1 deque的原理介绍3.2 deque的缺陷3.3 为什么选择deque作为stack和queue的底层默认容器 四. priority_queue&#xff08;优…...

Jmeter数据库url开关设置+常用Beanshell

1、数据库url开关设置 &#xff08;79 90&#xff09; jdbc:mysql://test.lemonban.com:3306/future?allowMultiQueries-true&characterEncodingUTF-8 多条查询开关&#xff1a;allowMultiQueriestrue 字符集配置:characterEncodingUTF-8 2、用BeanShell提取Map中的方…...

NtripShare 2025第一季度主要技术进展

GNSS方面 1、开源GNSS接收机配置软件基础版本。 2、商业版本GNSS接收机配置软件&#xff0c;增加PPP、文件保存、前端解算&#xff08;静态、RTK-Static&#xff09;&#xff0c;前端坐标转换。 3、GNSS接收机配置软件全面适配米尔T133i硬件方案。 视觉检测方面 1、做出第…...

Linux系统编程之内存映射

概述 内存映射是操作系统提供的一种机制&#xff0c;使得文件或设备的内容可以直接映射到进程的虚拟地址空间中。这意味着&#xff0c;我们可以像访问数组一样读写文件内容&#xff0c;而不需要显式地调用I/O函数进行数据传输。内存映射适用于多种应用场景&#xff0c;包括但不…...

一文详解Adobe Photoshop 2025安装教程

Adobe Photoshop下载安装和使用教程 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作&#xff0c…...

ShenNiusModularity项目源码学习(23:ShenNius.Admin.Mvc项目分析-8)

用户列表页面用于检索、新建、编辑、删除系统用户&#xff0c;同时设置用户角色。该页面对应的文件Index.cshtml位于ShenNius.Admin.Mvc项目的Areas\Sys\Views\User内&#xff0c;同目录下还有Modify.cshtml&#xff08;新建、编辑用户&#xff09;、SetRole.cshtml&#xff08…...

vue中 vue.config.js反向代理

新建一个node 服务 1 npm init -y //创建一个package.json 2.npm i express 3. 新建一个app.js 4.键入代码 const express require("express") const app express()app.get("/user",(req,res)>{res.send({"name":"good"…...

AIGC赋能智慧医疗:从影像诊断到个性化治疗的革命性突破

一、医疗AIGC技术架构 1.1 医疗场景技术挑战 医疗环节 行业痛点 AIGC解决方案 影像诊断 人工阅片效率低 多模态病灶分割与分级系统 病历管理 结构化程度低 语音转文本智能编码 药物研发 周期长成本高 分子生成与虚拟筛选 个性化治疗 方案标准化不足 基因组学临床数据融合模型 1…...

Yarn 安装与使用教程

Yarn 安装与使用教程 Yarn 是一个由 Facebook 开发的 JavaScript 包管理工具&#xff0c;它比传统的 npm 更加高效、可靠&#xff0c;并且在性能上有所提升。Yarn 主要解决了 npm 安装速度慢、并发性差、缓存机制不完善等问题&#xff0c;它提供了更快的安装速度、更稳定的依赖…...

机器学习之二:指导式学习

正如人们有各种各样的学习方法一样&#xff0c;机器学习也有多种学习方法。若按学习时所用的方法进行分类&#xff0c;则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念&#xff0c;…...

【学习笔记】检索增强生成(RAG)技术

检索增强生成&#xff08;RAG&#xff09;技术&#xff1a;原理、实现与发展趋势 1. RAG技术概述 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;是一种将信息检索与生成模型相结合的技术&#xff0c;旨在增强大型语言模型的知识能力和…...

计算机视觉——对比YOLOv12、YOLOv11、和基于Darknet的YOLOv7的微调对比

概述 目标检测领域取得了巨大进步&#xff0c;其中 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 在实时检测方面表现出色。尽管这些模型在通用目标检测数据集上表现卓越&#xff0c;但在 HRSC2016-MS&#xff08;高分辨率舰船数据集&#xff09; 上对 YOLOv12 进行微调时&…...

Pygame跨平台打包:将游戏发布到Windows、Mac和Linux

Pygame跨平台打包:将游戏发布到Windows、Mac和Linux 引言 在游戏开发的世界中,Pygame 是一个非常受欢迎的库,它使得使用 Python 编写 2D 游戏变得简单而有趣。然而,当你完成了一个游戏并希望将其发布给更多的玩家时,如何将你的游戏打包成可以在不同操作系统上运行的可执…...

关于图论的知识

如果一个无向图有 $n\times (n-1)\div 2$ 条边&#xff0c;称为**完全图** 如果一个完全图任意两个点都可以互相到达&#xff0c;称为**连通图** 一个包含 $dfs$ 与 $bfs$ 的图的遍历程序 程序可做到的&#xff1a; 1、每一行输出一个 **搜索树** 2、$dfs$ 与 $bfs$ 并存 c…...

365打卡第R3周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10 编译器&#xff1a;Jupyter Lab 深度学习环境&#xff1a;torch2.5.1 torchvision0…...

如何解决IDE项目启动报错 error:0308010C:digital envelope routines::unsupported 问题

如何解决IDE项目启动报错 error:0308010C:digital envelope routines::unsupported 问题 在现代软件开发过程中&#xff0c;开发人员通常使用集成开发环境&#xff08;IDE&#xff09;如IntelliJ IDEA、Visual Studio Code&#xff08;VSCode&#xff09;等进行Node.js项目开发…...

嵌入式学习笔记 - HAL_xxx_MspInit(xxx);函数

使用cubeMX生成的HAL库函数中&#xff0c;所有外设的初始化函数HAL_xxx_Init(&xxxHandle)中都存在有此调用函数&#xff0c;此调用函数其实是对各外设模块比如UART&#xff0c;I2C等的底层硬件初始化&#xff0c;包括UART时钟&#xff0c;以及UART用到的GPIO的工作模式以及…...

Dify框架面试内容整理-Dify框架

什么是Dify框架? Dify框架是一个开源的AI应用开发平台,专注于帮助开发者和非技术人员快速构建、部署和管理基于大语言模型(如GPT系列、国产开源模型)的应用。 Dify框架的特点:...

计算机网络的五层结构(物理层、数据链路层、网络层、传输层、应用层)到底是什么?

文章目录 五层结构1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 应用层&#xff08;Application Layer&#xf…...

【计算机视觉】CV实战项目 -深度解析PaddleSegSharp:基于PaddleSeg的.NET图像分割解决方案

深度解析PaddleSegSharp&#xff1a;基于PaddleSeg的.NET图像分割解决方案 技术背景与项目概述核心功能与特点实战部署指南环境要求硬件要求软件依赖 项目结构快速开始1. 获取项目2. 准备模型文件3. 运行示例 高级使用技巧模型切换背景替换性能优化 常见问题与解决方案技术原理…...

面试新收获-大模型学习

大模型原理 Transformer 架构与自注意力机制 Transformer 是当前大多数大模型采用的核心架构&#xff0c;由编码器-解码器组成&#xff0c;摒弃了传统 RNN 的顺序处理方式。Transformer 中关键在于多头自注意力机制&#xff08;Multi-Head Self-Attention&#xff09;&#xf…...

《Keras 3部署全攻略:从新手到实战高手》

《Keras 3部署全攻略:从新手到实战高手》 一、引言:开启 Keras 3 部署之旅 在深度学习的广阔领域中,Keras 一直以其简洁易用、高度模块化的特性,深受开发者的喜爱,被誉为深度学习的 “福音”。而如今,Keras 3 的强势登场,更是为这个领域注入了全新的活力。它像是一位集…...

如何修改npm的全局安装路径?

修改 npm 的全局安装路径可以通过以下步骤完成&#xff0c;确保全局包&#xff08;使用 -g 安装的模块&#xff09;和缓存文件存储到自定义路径。以下是详细步骤&#xff1a; 1. 创建自定义路径的目录 在目标路径下创建两个文件夹&#xff0c;分别用于存储全局模块和缓存文件…...

计算机网络 | Chapter1 计算机网络和因特网

&#x1f493;个人主页&#xff1a;mooridy-CSDN博客 &#x1f493;文章专栏&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f339;关注我&#xff0c;和我一起学习更多计算机网络的知识 &#x1f51d;&#x1f51d; 目录 …...

前端面试 HTML篇

src和href的区别 src和href都是用来加载外部资源&#xff0c;区别如下 src&#xff1a;当浏览器解析到该元素时&#xff0c;会暂停其他资源的加载和处理&#xff0c;直到该资源加载完成。 它会将资源内容嵌入到当前标签所在的位置&#xff0c;将其指向的资源下载应用到文档内…...

Prometheus、Zabbix 和 Nagios 这三个工具的对100个节点的部署设计的信息流

Prometheus 1. 基本组件及角色 Prometheus主要由Prometheus Server、Exporter、Alertmanager和Grafana(可选)等组件构成。 Prometheus Server:负责数据的收集、存储和查询,以及规则的评估。Exporter:部署在被监控节点上,负责收集节点的各种指标数据。Alertmanager:负责…...

Tableau 基础表制作

目录 1.数据连接 2. 数据可视化 3. 基础表制作 3.1 对比分析&#xff1a;比大小 1. 柱状图 2. 条形图 3. 热力图 4. 气泡图 5. 词云 3.2 变化分析&#xff1a;看趋势 1. 折线图 2. 面积图 3.3 构成分析&#xff1a;看占比 1. 饼图 2. 树地图 3. 堆积图 3.4 关…...

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI&#xff08;人工通用智能&#xff09;的未来发展及其对社会的影响&#xff0c;用大白话总结如下&#xff1a; 核心观点&#xff1a; AGI是什么&#xff1f; AGI是一种能像人类一样解决各种复杂问题的智能系统&#xff0c;比…...

springboot入门-service层构造器注入原理

在 Spring Boot 中&#xff0c;通过构造器注入的方式将 Repository&#xff08;JPA&#xff09;或 Mapper&#xff08;MyBatis&#xff09;注入到 Service 层的原理及示例如下&#xff1a; 1. 构造器注入的原理 依赖注入&#xff08;DI&#xff09;机制&#xff1a; Spring 容…...

JavaScript 笔记 --- part6 --- JS进阶 (part1)

JS 进阶(part1) 作用域 局部作用域 定义: 局部作用域指的是在函数内部定义的变量&#xff0c;只能在函数内部访问&#xff0c;外部不能访问。 特点: 局部作用域变量只能在函数内部或代码块中访问&#xff0c;外部不能访问。 分类: 函数作用域: 指的是在函数内部定义的变量&…...

使用matplotlib绘制Raincloud图/云雨图/柱状图/小提琴图

需求&#xff1a; 使用Python的matplotlib绘制数据分布、数据箱型图、数据散点图 参考&#xff1a; https://blog.csdn.net/weixin_39559994/article/details/128197965?fromshareblogdetail&sharetypeblogdetail&sharerId128197965&sharereferPC&sharesource…...

BT152-ASEMI机器人率器件专用BT152

编辑&#xff1a;LL BT152-ASEMI机器人率器件专用BT152 型号&#xff1a;BT152 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 引脚数量&#xff1a;3 封装尺寸&#xff1a;如图 特性&#xff1a;单向可控硅 工作结温&#xff1a;-40℃~150℃ …...

【Redis——通用命令】

文章目录 Redis为什么快&#xff1f;生产环境的概念Redis中最核心的两个命令get&#xff1a;通过key拿valueset&#xff1a;将key和value存入数据库 其他通用命令keysexist判定key是否存在delexpire&#xff1a;为指定的key设置一个过期时间TTL&#xff08;Time To Live&#x…...

qt之开发大恒usb3.0相机一

1.在大恒相机给的sample里没有看见qt开发的demo. 第一步先运行c sdk中中的demo&#xff0c;看了下代码&#xff0c;大恒使用的UI框架是MFC.然后 vs2022编译。运行结果 第一步&#xff0c;先用qt进行坐下页面布局&#xff0c;如下图&#xff08;保存图片的地方做了些更改&#…...

系列位置效应——AI与思维模型【80】

一、定义 系列位置效应思维模型是指在一系列事物或信息的呈现过程中&#xff0c;人们对于处于系列开头和结尾部分的项目的记忆效果优于中间部分项目的现象。具体而言&#xff0c;开头部分的记忆优势被称为首因效应&#xff0c;结尾部分的记忆优势被称为近因效应。这种效应反映…...

解决conda虚拟环境安装包却依旧安装到base环境下

最近跑项目装包装到几度崩溃&#xff0c;包一直没有安装到正确位置&#xff0c;为此写下这篇文章记录一下&#xff0c;也希望能帮到有需要的人。&#xff08;此文章开发环境为anaconda和window&#xff09; 方法一 先conda deactivate,看到&#xff08;base&#xff09;消失…...

设计看似完美却测不过? Intra-Pair Skew 是「讯号完整性(Signal Integrity)」里最隐形的杀手

各位不知道有没有遇过&#xff0c;一对很长的差分走线&#xff0c;看起来很正常&#xff0c;但是测试结果偶尔会fail偶尔会pass&#xff0c;不像是软件问题&#xff0c;也不像是制程问题。 看了一下Layout&#xff0c;发现阻抗匹配控制的非常好&#xff0c;TDR测试也显示阻抗好…...

使用MyBatis注解方式的完整示例,涵盖CRUD、动态SQL、分页、事务管理等场景,并附详细注释和对比表格

以下是使用MyBatis注解方式的完整示例&#xff0c;涵盖CRUD、动态SQL、分页、事务管理等场景&#xff0c;并附详细注释和对比表格&#xff1a; 项目结构 mybatis-annotation-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com.example/…...

【头脑风暴】加权平均

一些加权平均而不是算术平均的思路&#xff0c;启发来源&#xff1a;ACLS,WACLS。 简单平均假设所有样本的误差和噪声特性相同&#xff0c;但在实际电路中&#xff0c;不同阶段、不同时间点的样本价值&#xff08;对最终精度的贡献&#xff09;是不同的。​​加权平均的核心思想…...

DAM-3B,英伟达推出的多模态大语言模型

DAM-3B是什么 DAM-3B&#xff08;Describe Anything 3B&#xff09;是英伟达推出的一款多模态大语言模型&#xff0c;专门用于为图像和视频中的特定区域生成详细描述。用户可以通过点、边界框、涂鸦或掩码等方式来标识目标区域&#xff0c;从而得到精准且符合上下文的文本描述…...