【安心陪诊 Agent】Node.js 20 + Express 4 实战:Web Demo 与规则 Agent 架构

发布时间:2026/9/11 4:28:48

【安心陪诊 Agent】Node.js 20 + Express 4 实战:Web Demo 与规则 Agent 架构 【安心陪诊 Agent】Node.js 20 Express 4 实战Web Demo 与规则 Agent 架构在陪诊产品中最容易被误解的需求是“做一个能聊天的 Agent”。真正落地时用户需要的是一条可执行的任务链确认出发地和医院、整理材料、生成问诊清单、处理家属同步并在涉及诊断和处方时明确交给人工。本文用一个 Web Demo 说明 Page、Node.js API 和规则 Agent 如何协作。​编辑​编辑​编辑​编辑​编辑​编辑​编辑​​编辑编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​​编辑编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​​编辑编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​编辑一、本文解决什么问题本文聚焦“自然语言输入如何变成稳定任务卡片”。示例环境为 Node.js 20.11.1、Express 4.18.3、Chrome 126前端通过结构化 code 判断页面状态后端不输出诊断结论。层级职责不负责什么Page输入、加载、卡片展示不判断医疗结论API Service校验参数、返回协议不保存无关隐私Rule Agent拆解任务、拦截越界问题不替代医生二、目录和启动方式src/ server.js routes/plan.js services/plan-service.js rules/safety-rule.js public/index.html node --version npm list express npm run dev​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑先固定 Node.js 和 Express 版本再启动本地服务。这样读者遇到请求体解析或路由行为差异时可以先排除运行时版本问题。三、接口协议先定义状态再写页面import express from express; const app express(); app.use(express.json()); app.post(/api/plan, (req, res) { const { start, hospital, visitTime } req.body || {}; if (!start || !hospital) { return res.status(400).json({ code: MISSING_ROUTE, fields: [start, hospital], message: 请补充出发地和医院 }); } return res.json({ code: OK, route: { start, hospital, visitTime: visitTime || 待确认 }, tasks: [材料清单, 问诊问题, 家属同步] }); });​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑返回值使用 code、route 和 tasks 三个稳定字段。前端不需要猜测自然语言也能对正常、缺字段和安全拦截分别渲染。四、规则 Agent 的安全边界const blocked [诊断, 处方, 剂量, 停药]; function guard(text) { const hit blocked.find((word) String(text || ).includes(word)); return hit ? { code: SAFE_GUARD, hit, next: 人工确认 } : { code: OK }; }​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑规则只负责发现风险并给出下一步不输出病情判断。这个边界既能减少误导也让测试用例有明确的预期。五、前端如何消费返回值async function submitPlan(form) { const response await fetch(/api/plan, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(form) }); const data await response.json(); if (data.code MISSING_ROUTE) return showFormError(data.message); if (data.code SAFE_GUARD) return showSafetyCard(data.next); return renderTaskCards(data.tasks); }​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑页面只根据协议渲染状态错误提示可修复安全提示需要人工确认成功状态展示任务卡片。网络失败时还要保留重试按钮和当前输入。六、可复现请求和返回curl -X POST http://localhost:5188/api/plan ^ -H Content-Type: application/json ^ -d {start:杭州西湖文化广场,hospital:浙江省人民医院,visitTime:周三上午} { code: OK, tasks: [材料清单, 问诊问题, 家属同步] }​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑七、验收清单场景输入预期结果正常规划出发地、医院、时间200、OK、任务非空通过缺少医院hospital 为空400、MISSING_ROUTE通过风险问题包含诊断或剂量SAFE_GUARD、人工确认通过网络失败服务停止显示重试不丢输入通过移动窗口手机宽度打开页面卡片不遮挡按钮通过八、常见问题问题原因处理页面只显示一段文本前端没有按 code 分支统一消费结构化返回接口返回 400缺少必填字段检查 start 和 hospital安全提示不出现规则没有在入口执行在 /api/chat 和 /api/plan 前置 guard九、总结安心陪诊 Agent 的工程价值不在于“什么都能聊”而在于把就医准备拆成可验证任务并对医疗风险保持克制。固定版本、明确协议、保留异常路径和真实验收记录才能让 Web Demo 具备迁移到 HarmonyOS ArkTS 的基础。扩展验证从 Web Demo 迁移到 HarmonyOSWeb Demo 的协议不应该和页面组件绑死。迁移到 HarmonyOS ArkTS 时可以把 PlanResult、TaskItem 和 SafetyNotice 作为公共模型页面只负责状态渲染网络访问放在 ServicePreferences 只保存用户主动勾选的轻量设置。interface TaskItem { title: string; detail: string; done: boolean; } interface PlanResult { code: OK | MISSING_ROUTE | SAFE_GUARD; message?: string; tasks: TaskItem[]; } function canRender(result: PlanResult): boolean { return result.code OK result.tasks.length 0; }​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑这样迁移时Web 的返回值仍然可以驱动原生任务卡片网络失败、空数据和安全拦截也能保持一致不需要在每个页面重复判断字符串。异常路径和重试策略异常用户看到的状态下一步网络超时服务暂时不可用保留输入并重试接口 400指出缺少的字段回到表单定位修复返回数据为空暂无可生成任务允许重新描述需求命中医疗风险需要人工确认不输出诊断和剂量重试不能无限循环。前端最多自动重试一次之后显示明确按钮服务端记录请求耗时和错误码但不记录不必要的病情细节和家属联系方式。测试矩阵const cases [ { name: normal, body: { start: 杭州, hospital: 省人民医院 }, expect: OK }, { name: missing-hospital, body: { start: 杭州 }, expect: MISSING_ROUTE }, { name: medical-risk, body: { start: 杭州, hospital: 省人民医院, text: 如何调整剂量 }, expect: SAFE_GUARD } ];​编辑​编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑​​编辑编辑​编辑测试名称直接对应接口返回码验收人员可以先跑接口再打开页面核对状态。这样问题能定位到协议、规则还是 UI而不是只记录“按钮点过了”。发布前复查项目检查方式通过标准版本node --version、npm list expressNode 20.11.1、Express 4.18.3接口curl 调用 /api/plan成功与错误码都可复现图片列表页和正文预览封面、流程和项目截图清晰隐私检查日志和请求体不上传无关个人信息移动端Chrome 126 缩小窗口按钮、卡片和错误提示可见完整的陪诊 Agent 不是一个泛聊天框而是一个可解释、可验证、可回退的任务系统。版本、协议、代码和测试记录彼此对应文章才真正能帮助读者复现。可运行接口规则 Agent 如何接收、校验并返回任务以下示例来自 Demo 的 Node.js 20.11.1 与 Express 4.18.3 服务层。它只把用户已经确认的陪诊事项整理为待办不推断病情也不生成诊疗建议。请求体在进入规则层前完成字段校验便于本地复现。import express from express; const app express(); app.use(express.json()); app.post(/api/escort-plan, (req, res) { const { hospital, visitAt, need } req.body ?? {}; if (![hospital, visitAt, need].every((value) typeof value string value.trim())) { return res.status(400).json({ code: INVALID_ARGUMENT, message: hospital、visitAt、need 为必填文本 }); } const tasks [ 提前确认 ${hospital} 的院区和到达时间, 准备证件、既往检查资料和问题清单, 在 ${visitAt} 前预留出行与签到时间 ]; return res.json({ code: OK, version: demo-1.0.0, tasks, boundary: not-medical-diagnosis }); }); app.listen(3000);​编辑​编辑​编辑​​编辑编辑本地验证命令node server.mjs后执行curl -X POST http://127.0.0.1:3000/api/escort-plan -H Content-Type: application/json -d {\hospital\:\门诊楼\,\visitAt\:\09:00\,\need\:\协助取号\}。预期得到 200、三个待办和not-medical-diagnosis边界标记缺失字段时返回 400。验证项输入预期结果正常任务院区、时间、需求齐全200返回 3 条可执行待办字段缺失visitAt 为空400不生成任务医疗边界症状或用药问题提示联系专业医疗人员不作诊断完整接口契约任务生成不是一句提示词在 Demo 里规则 Agent 的输出要先定义成稳定的数据协议再交给页面渲染。否则同一个“帮我准备陪诊”的输入今天可能返回字符串明天变成数组前端会不断增加临时判断。这里的协议只描述流程事项和展示状态明确不携带病情判断、药品剂量或处方内容。export type TaskStatus todo | done | blocked; export interface EscortTask { id: string; title: string; status: TaskStatus; source: rule; } export interface EscortPlanResponse { code: OK | INVALID_ARGUMENT | OUT_OF_SCOPE; message: string; tasks: EscortTask[]; traceId: string; } export function toPlanResponse(input: { hospital: string; visitAt: string; need: string }): EscortPlanResponse { const traceId crypto.randomUUID(); if (![input.hospital, input.visitAt, input.need].every((value) value.trim())) { return { code: INVALID_ARGUMENT, message: 请补全医院、时间和陪诊需求, tasks: [], traceId }; } if (/处方|剂量|确诊|诊断/.test(input.need)) { return { code: OUT_OF_SCOPE, message: 该问题需要由医生或药师处理, tasks: [], traceId }; } return { code: OK, message: 已生成就诊准备清单, traceId, tasks: [ { id: arrival, title: 确认 ${input.hospital} 的院区与到达路线, status: todo, source: rule }, { id: materials, title: 准备证件、病历和检查资料, status: todo, source: rule }, { id: time, title: 在 ${input.visitAt} 前预留签到时间, status: todo, source: rule } ] }; }​编辑​编辑页面只根据code决定状态OK展示任务卡片INVALID_ARGUMENT高亮未完成字段OUT_OF_SCOPE显示医疗边界说明。这样 UI 不解析自然语言也不会把错误信息伪装成成功结果。HTTP 路由、超时与可观察性服务端在 Node.js 20.11.1 和 Express 4.18.3 下运行。每次请求分配 traceId日志只记录流程字段和结果码不记录身份证号、病历图片或具体病情描述。前端超时后保留用户输入并允许再次提交。app.post(/api/escort-plan, (req, res) { const startedAt Date.now(); const result toPlanResponse(req.body ?? {}); console.info(JSON.stringify({ event: escort_plan, traceId: result.traceId, code: result.code, durationMs: Date.now() - startedAt })); const status result.code OK ? 200 : result.code INVALID_ARGUMENT ? 400 : 422; res.status(status).json(result); }); app.use((error, _req, res, _next) { console.error(unexpected_error, error?.message); res.status(500).json({ code: SERVER_ERROR, message: 服务暂不可用请稍后重试, tasks: [] }); });​编辑​编辑本地运行命令为npm ci、npm run dev。使用 Chrome 126 打开页面后在 Network 面板中可核对请求体、状态码和 traceId调用失败时页面展示重试按钮而不是清空已填写的医院与时间。从接口到页面的状态表接口返回页面表现用户下一步日志字段200 / OK显示 3 个待办卡片勾选已准备事项traceId、durationMs、OK400 / INVALID_ARGUMENT定位缺失字段补全后再次生成traceId、INVALID_ARGUMENT422 / OUT_OF_SCOPE显示医疗边界提示联系医生或药师traceId、OUT_OF_SCOPE500 / SERVER_ERROR保留输入和重试入口稍后重试traceId、SERVER_ERROR可复现的测试与验收记录import assert from node:assert/strict; const normal toPlanResponse({ hospital: 门诊楼, visitAt: 09:00, need: 协助取号 }); assert.equal(normal.code, OK); assert.equal(normal.tasks.length, 3); const missing toPlanResponse({ hospital: , visitAt: 09:00, need: 协助取号 }); assert.equal(missing.code, INVALID_ARGUMENT); const boundary toPlanResponse({ hospital: 门诊楼, visitAt: 09:00, need: 这个药吃多少 }); assert.equal(boundary.code, OUT_OF_SCOPE);​编辑​编辑执行node --test test/escort-plan.test.js三条断言应全部通过。最后再进行一轮人工验收窄屏 360px、普通桌面 1280px、请求超时、重复点击提交、医疗边界输入。每一项都应有 loading、success、error 或 disabled 的可见状态。验收项操作通过标准正常生成填入医院、时间、取号需求返回三条任务并可勾选重复提交连续点击两次生成按钮 loading只有一次结果断网浏览器离线后提交输入保留并显示重试边界输入输入诊断/剂量问题不生成医疗建议小屏宽度 360px任务卡和按钮不溢出前端状态机防止重复提交与结果闪烁Web Demo 的交互状态需要独立于接口返回管理。用户点击“生成陪诊清单”后按钮先进入 loading接口成功才进入 success网络异常进入 error在 loading 期间禁用再次点击。这样即使网络抖动也不会出现两次请求覆盖同一组任务的情况。const state { phase: idle, error: , plan: null }; function renderPlanState() { submitButton.disabled state.phase loading; submitButton.textContent state.phase loading ? 正在生成... : 生成陪诊清单; errorBox.hidden state.phase ! error; errorBox.textContent state.error; resultPanel.hidden state.phase ! success; } async function submitPlan(payload) { if (state.phase loading) return; state.phase loading; state.error ; renderPlanState(); try { const response await fetch(/api/escort-plan, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(payload) }); const data await response.json(); if (!response.ok) throw new Error(data.message || 请求失败); state.plan data; state.phase success; } catch (error) { state.phase error; state.error String(error.message || error); } renderPlanState(); }​编辑可访问性也要在 Demo 中可见错误区域使用rolealertloading 状态使用aria-busytrue任务勾选框必须有文字标签。键盘使用 Tab 可以依次到达医院、时间、需求、提交按钮和重试按钮焦点不会落到被隐藏的结果面板上。交互场景检查动作预期反馈网络慢模拟 3 秒响应按钮禁用且显示正在生成连续点击快速点击提交两次只发送一次请求请求失败返回 500保留表单并显示重试键盘操作仅使用 Tab 与 Enter完整走通提交流程完成上述验证后Demo 的价值不再只是“能跑起来”它有明确输入、稳定接口、可见状态、异常兜底和可被他人复查的测试路径。这些内容也方便后续迁移到 HarmonyOS ArkUI 页面由页面状态、服务层和本地记录共同承担任务闭环。延伸阅读这篇文章和同项目的实现、测试或排错文章可以组合阅读下面两篇给出相邻的工程上下文。查看本系列的相关实践 1查看本系列的相关实践 2
延伸阅读

更多相关文章

2026/9/12 0:41:33

告别繁琐清理!AI 输出的内容粘贴有符号好烦靠 AI 导出鸭一键优化

AI输出的内容粘贴有符号好烦,AI 导出鸭轻松清除冗余符号整洁排版告别繁琐清理!AI输出的内容粘贴有符号好烦靠AI 导出鸭一键优化AI输出的内容粘贴有符号好烦无需手动删减,AI 导出鸭高效规整内容 引言 现如今大家日常使用各类智能AI平台生成文案…

2026/9/12 0:41:03

EU AI Act工程化:把合规条款编译成可运行的Guardrails

1. 项目概述:这不是合规 checklist,而是一套能让你代码跑得更快的“AI刹车片”“EU AI Act Quick Wins: Ship Faster With Guardrails”——这个标题里藏着一个被绝大多数技术团队严重误读的真相:欧盟人工智能法案(EU AI Act&…

2026/9/11 21:25:45

Bently Nevada 133388-01(3500/53 超速保护监测模块)

一、基础信息完整型号:3500/53-02-00物料编号:133388-01定位:汽轮机、风机、压缩机专用电子超速保护模块,满足 API670、API612 机组安全规范,可构建 2 取 2 / 3 取 2 冗余表决 ETS 跳闸回路安装规格:3500 机…

2026/9/12 0:39:21

毕业设计之django图书馆座位预约系统

题目:毕业设计之django图书馆座位预约系统一、项目介绍随着时代的发展,人们的生活方式得到巨大的改变,从而慢慢地产生了大量图书馆座位预约,图书馆座位预约需要一个现代化的系统,进行图书馆座位预约的管理。图书馆座位…

2026/9/12 0:39:21

ShuffleNet轻量级网络实战:从分组卷积到宠物年龄识别

简介:这套基于 shufflenet 的宠物年龄识别项目,面向希望快速上手 PyTorch 图像分类的 Python/CV 学习者,解决从数据整理到模型训练、界面推理的完整闭环问题。代码仅三个 py 文件,流程简洁:可自动生成训练验证 txt、训…

2026/9/12 0:39:21

基于Android的跑步App源码全解析:定位、前台服务与数据算法

简介:基于Android平台、采用Java开发的跑步App完整项目源码,面向Android初学者和需要完成课程设计的学生,可用于快速掌握移动端应用开发流程。资源内置用户注册登录、计步传感器监测、运动计时、任务目标设定、跑步记录持久化存储等功能模块&…

2026/9/12 0:39:21

Python异步编程:核心原理与高并发实战

1. Python异步编程的核心价值与应用场景在当今高并发的互联网应用中,传统的同步编程模式常常面临性能瓶颈。我十年前第一次处理Web爬虫项目时,就深刻体会到了同步请求的效率问题——每个请求都要等待前一个完成,导致程序大部分时间都在空转。…

2026/9/12 0:34:20

MIMO-OFDM链路级仿真:信道估计、均衡与SCM信道模型

简介:面向无线通信研究与工程人员的多输入多输出正交频分复用(MIMO-OFDM)Matlab仿真资源,对应3G、4G、5G中多天线与正交频分复用核心技术的代码实现,包含完整的收发链路、信道估计与空间信道模型(SCM&#…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码