Skip to content

实验帮 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>

部署(备案下来后)

  1. 服务器装 Node ≥ 18、PostgreSQL,建库建用户。
  2. git pullnpm ci → 填 .envnpm run migrate
  3. PM2 常驻:
    bash
    pm2 start src/server.js --name labcalc-server
    pm2 save
  4. Caddy 反代(/etc/caddy/Caddyfile):
    labapi.你的备案域名 {
        reverse_proxy 127.0.0.1:3000
    }
  5. 小程序后台「开发 → 开发管理 → 服务器域名」把 https://labapi.你的备案域名 加入 request 合法域名

安全

  • WX_APPSECRETJWT_SECRETAI_API_KEY 只存后端 .env绝不写进小程序前端
  • .env 已在 .gitignore,不要提交。
  • AI 回答强制追加免责声明;不存储用户实验敏感数据用于训练。

个人科研与运维文档 · 内容持续修订