chore: connect GitLink repository history
English | 简体中文
一个面向 Node.js 初学者和 API 集成练习者的小型 Express 学习实验室:用同一套前后端展示本地计算、免密公共 API 与受限 AI 代理三种后端模式。
项目状态:Demo / Learning Lab,版本 0.1.0。 这是教学参考实现,不是可直接托管到公网的公共 API 或 AI 网关。排序功能完全离线;天气需要网络;AI 对话默认关闭,只有服务器所有者配置自己的凭据后才启用并可能产生费用。
截图使用 ?preview=1 生成,不请求浏览器定位、不配置 AI Key,也不包含个人数据。
?preview=1
很多 API 教程只展示“请求成功”的理想路径。这个项目同时保留了可以运行的页面,并把输入校验、外部请求超时、统一错误结构、日志脱敏、依赖注入、Mock 测试和 AI 成本边界放进一个足够小的代码库中。
适合:Express 入门、前后端联调、API 代理与错误处理练习。它不适合:公开托管多人共享的 AI 代理、生产监控服务或需要账户/持久化数据的应用。
/api/deepseek
/api/chat
127.0.0.1
前置条件:Node.js 20 或更高版本,npm 10 或更高版本。
npm ci npm start
打开 http://127.0.0.1:3000。不创建 .env 也能启动并使用排序;AI 卡片会显示未配置提示。
.env
另开终端验证健康检查和离线排序:
curl http://127.0.0.1:3000/health curl -X POST http://127.0.0.1:3000/api/sort \ -H "Content-Type: application/json" \ -d '{"numbers":"3, 1, 2","order":"asc"}'
预期排序结果中的 result 为 [1,2,3]。Windows PowerShell 也可使用:
result
[1,2,3]
Invoke-RestMethod http://127.0.0.1:3000/health Invoke-RestMethod http://127.0.0.1:3000/api/sort -Method Post ` -ContentType 'application/json' -Body '{"numbers":"3, 1, 2","order":"asc"}'
只有需要 AI 功能时才复制配置模板:
cp .env.example .env
Windows PowerShell:
Copy-Item .env.example .env
HOST
PORT
3000
UPSTREAM_TIMEOUT_MS
8000
ARK_API_KEY
DEEPSEEK_API_KEY
ARK_MODEL
DEEPSEEK_MODEL
ARK_API_BASE_URL
AI_MAX_MESSAGE_CHARS
2000
AI_MAX_HISTORY_ITEMS
10
AI_MAX_OUTPUT_TOKENS
1024
AI_DEFAULT_OUTPUT_TOKENS
512
AI_RATE_LIMIT_MAX
AI_RATE_LIMIT_WINDOW_MS
60000
AI_ALLOWED_HOSTS
AI_ALLOWED_ORIGINS
.env 已被 Git 忽略。若你从旧项目副本继承过真实 DEEPSEEK_API_KEY,请先在服务商控制台吊销或轮换,不能仅靠删除本地文件解决泄露风险。
POST /api/sort
{ "numbers": "8, 3, 5", "order": "desc" }
最多接受 100 个有限数值,order 只能是 asc 或 desc。
order
asc
desc
GET /api/weather?lat=31.23&lon=121.47
经纬度分别限制在 [-90, 90] 与 [-180, 180]。反向地理编码失败时仍返回天气,主要天气请求失败或超时时返回统一的 502/504 错误。
[-90, 90]
[-180, 180]
天气数据来自 Open-Meteo,页面和 API 响应均包含来源说明。
POST /api/chat
{ "message": "用一句话解释 Express 中间件", "history": [{ "role": "assistant", "content": "可以。" }], "max_completion_tokens": 256, "reasoning_effort": "low" }
服务器只接受纯文本 user/assistant 历史;不会把上游响应正文或内部错误原样返回浏览器。
user
assistant
AI 路由只接受 application/json。默认本机模式只接受 localhost、127.0.0.1 或 ::1 Host;带 Origin 的浏览器请求必须来自本机允许主机。CLI/原生客户端可以不发送 Origin,但仍须通过 Host 校验和频率限制。非本机部署必须显式设置允许列表,并在此策略之外增加真实认证与持久化共享配额。
application/json
localhost
::1
Origin
所有 API 错误使用相同结构:
{ "error": { "code": "VALIDATION_ERROR", "message": "可安全展示的错误说明", "requestId": "用于定位本次请求的 ID" } }
flowchart LR Browser["浏览器页面"] --> App["Express app"] App --> Sort["本地排序路由"] App --> Weather["天气服务"] App --> Chat["受限 AI 服务"] Weather --> OpenMeteo["Open-Meteo"] Chat --> Ark["Volcengine Ark"]
src/ ├─ app.js # 组合中间件、服务和路由;不监听端口 ├─ server.js # 读取本地环境并管理进程生命周期 ├─ config.js # 有边界的配置解析 ├─ lib/ # 错误、校验、超时请求、内存限流 ├─ routes/ # HTTP 输入/输出层 └─ services/ # Open-Meteo 与 Ark 上游适配 test/app.test.js # 无真实外部调用的 HTTP 集成测试 scripts/ # 语法、冒烟与发布面扫描
更详细的设计和威胁边界见 docs/architecture.md。
npm run lint npm test npm run test:coverage npm run smoke npm run security:scan npm run verify
测试通过依赖注入 Mock 天气与 AI 响应,不访问真实外部服务、不使用真实 Key、不产生模型费用。CI 在 Node.js 20 和 22 上从 lockfile 全新安装并运行 npm run verify。
npm run verify
本项目由一个包含排序、天气和 AI 问答的课程 Demo 演化而来。当前目标是提供可审阅的 API 集成参考,而不是包装成统一商业产品。
代码计划以 MIT License 发布。仓库公开前,所有者仍须完成 docs/release-audit.md 中的原创性与第三方权利确认。
docs/release-audit.md
小型 Express 学习实验室,通过排序、天气与受保护的 AI 代理示例展示输入校验、外部 API 集成和安全边界。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Express API Integration Lab
English | 简体中文
一个面向 Node.js 初学者和 API 集成练习者的小型 Express 学习实验室:用同一套前后端展示本地计算、免密公共 API 与受限 AI 代理三种后端模式。
截图使用
?preview=1生成,不请求浏览器定位、不配置 AI Key,也不包含个人数据。为什么值得看
很多 API 教程只展示“请求成功”的理想路径。这个项目同时保留了可以运行的页面,并把输入校验、外部请求超时、统一错误结构、日志脱敏、依赖注入、Mock 测试和 AI 成本边界放进一个足够小的代码库中。
适合:Express 入门、前后端联调、API 代理与错误处理练习。它不适合:公开托管多人共享的 AI 代理、生产监控服务或需要账户/持久化数据的应用。
能力边界
/api/deepseek仅为旧页面兼容别名;新代码应使用/api/chat。127.0.0.1。不要在没有认证、持久化限流、TLS 和反向代理的情况下直接暴露到公网。快速开始(无需 API Key)
前置条件:Node.js 20 或更高版本,npm 10 或更高版本。
打开 http://127.0.0.1:3000。不创建
.env也能启动并使用排序;AI 卡片会显示未配置提示。另开终端验证健康检查和离线排序:
预期排序结果中的
result为[1,2,3]。Windows PowerShell 也可使用:可选配置
只有需要 AI 功能时才复制配置模板:
Windows PowerShell:
HOST127.0.0.1PORT3000UPSTREAM_TIMEOUT_MS8000ARK_API_KEYDEEPSEEK_API_KEYARK_MODELDEEPSEEK_MODELARK_API_BASE_URLAI_MAX_MESSAGE_CHARS2000AI_MAX_HISTORY_ITEMS10AI_MAX_OUTPUT_TOKENS1024AI_DEFAULT_OUTPUT_TOKENS512AI_RATE_LIMIT_MAX10AI_RATE_LIMIT_WINDOW_MS60000AI_ALLOWED_HOSTSAI_ALLOWED_ORIGINS.env已被 Git 忽略。若你从旧项目副本继承过真实DEEPSEEK_API_KEY,请先在服务商控制台吊销或轮换,不能仅靠删除本地文件解决泄露风险。API 示例
POST /api/sort最多接受 100 个有限数值,
order只能是asc或desc。GET /api/weather?lat=31.23&lon=121.47经纬度分别限制在
[-90, 90]与[-180, 180]。反向地理编码失败时仍返回天气,主要天气请求失败或超时时返回统一的 502/504 错误。天气数据来自 Open-Meteo,页面和 API 响应均包含来源说明。
POST /api/chat服务器只接受纯文本
user/assistant历史;不会把上游响应正文或内部错误原样返回浏览器。AI 路由只接受
application/json。默认本机模式只接受localhost、127.0.0.1或::1Host;带Origin的浏览器请求必须来自本机允许主机。CLI/原生客户端可以不发送Origin,但仍须通过 Host 校验和频率限制。非本机部署必须显式设置允许列表,并在此策略之外增加真实认证与持久化共享配额。所有 API 错误使用相同结构:
架构
更详细的设计和威胁边界见 docs/architecture.md。
质量验证
测试通过依赖注入 Mock 天气与 AI 响应,不访问真实外部服务、不使用真实 Key、不产生模型费用。CI 在 Node.js 20 和 22 上从 lockfile 全新安装并运行
npm run verify。安全与贡献
Roadmap
项目来源与许可证
本项目由一个包含排序、天气和 AI 问答的课程 Demo 演化而来。当前目标是提供可审阅的 API 集成参考,而不是包装成统一商业产品。
代码计划以 MIT License 发布。仓库公开前,所有者仍须完成
docs/release-audit.md中的原创性与第三方权利确认。