主题
实验帮 LabCalc · 后端
微信登录 + 云端同步 + PubChem 代理 + AI 转发。对应前端仓库 labcalc-miniprogram。
设计依据:
../labcalc-miniprogram/产品设计方案.md第十章(全栈架构 v4)。
技术栈
- Node.js ≥ 18(用到全局
fetch) - Fastify 4 + @fastify/cors
- PostgreSQL(
pg) - JWT(
jsonwebtoken) - 进程:PM2;反代:Caddy(自动 HTTPS)
目录
src/
├── server.js 启动入口(注册路由 + 健康检查)
├── config.js 环境变量 + 能力探测
├── db/
│ ├── pool.js pg 连接池(无 DATABASE_URL 时降级禁用)
│ ├── schema.sql 建表 SQL
│ └── migrate.js 执行迁移
├── middleware/auth.js JWT 鉴权 + 签发
├── services/ 外部服务封装:wechat / pubchem / ai
├── routes/ auth / history / favorites / records / compound / ai
└── util/respond.js 统一响应信封 {success,data,error}本地开发
bash
cp .env.example .env # 填写真实值;DATABASE_URL 留空也能启动(降级模式)
npm install
npm run migrate # 已配置 DATABASE_URL 时建表
npm run dev # node --watch 热重载启动后访问 GET /healthz 查看能力探测结果(db / wxLogin / ai 是否就绪)。
降级设计:缺哪个外部依赖就只关闭对应功能,服务仍能启动。备案/数据库未就绪前,前端计算模块完全不依赖本服务。
接口一览
| 方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
| GET | /healthz | 否 | 健康检查 + 能力探测 |
| POST | /api/auth/login | 否 | {code} → 换 openid → 签发 JWT |
| GET/POST | /api/history | 是 | 计算历史 查/增 |
| DELETE | /api/history/:id | 是 | 删历史 |
| GET/POST | /api/favorites | 是 | 收藏 查/增 |
| DELETE | /api/favorites/:id | 是 | 删收藏 |
| GET/POST | /api/records | 是 | 实验记录本 查/增 |
| PUT/DELETE | /api/records/:id | 是 | 改/删记录 |
| GET | /api/compound?name= | 否 | PubChem 代理 + 缓存 |
| POST | /api/ai/ask | 是 | {messages} 转发 api.cong.in |
受保护接口请求头:Authorization: Bearer <token>。
部署(备案下来后)
- 服务器装 Node ≥ 18、PostgreSQL,建库建用户。
git pull→npm ci→ 填.env→npm run migrate。- PM2 常驻:bash
pm2 start src/server.js --name labcalc-server pm2 save - Caddy 反代(
/etc/caddy/Caddyfile):labapi.你的备案域名 { reverse_proxy 127.0.0.1:3000 } - 小程序后台「开发 → 开发管理 → 服务器域名」把
https://labapi.你的备案域名加入 request 合法域名。
安全
WX_APPSECRET、JWT_SECRET、AI_API_KEY只存后端.env,绝不写进小程序前端。.env已在.gitignore,不要提交。- AI 回答强制追加免责声明;不存储用户实验敏感数据用于训练。