ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

uniapp+koa+mongoose 增删改查实战:TaoToken 统一 Key 打通 SSL 配置

uniapp+koa+mongoose 增删改查实战:TaoToken 统一 Key 打通 SSL 配置 1. 从本地 3000 到线上 4004这套全链路到底卡在哪如果你正在用 uniapp 写前端、koa 写接口、mongoose 存数据本地跑得挺顺一上线就各种红叉那这篇基本就是给你写的。核心检索词先摆出来uniappkoamongoose 增删改查配合 SSL 配置把本地开发到线上部署这条链路打通。适合谁适合已经能跑通本地 CRUD、但卡在 https 证书、端口监听、跨域代理、小程序合法域名这几道坎上的同学。我先把整条链路拆开说清楚你才知道每一步在解决什么。前端 uniapp 负责页面和请求它不关心你后端是 http 还是 https只关心请求地址能不能通、域名合不合法。koa 是接口层负责接收请求、调 mongoose、返回 JSON。mongoose 是数据层负责连 MongoDB 并做增删改查。SSL 是传输层让 https 生效同时影响小程序能不能请求、浏览器会不会拦。真正让人头大的是环境切换。本地开发用http://localhost:3000线上用https://你的域名:4004两个环境的协议、端口、域名全不一样。如果密钥、证书路径、连接串这些配置散落在各个文件里改一处漏一处就会出现「本地好好的线上 502」这种经典问题。所以这篇除了讲 CRUD 和 SSL还会讲怎么用 TaoToken 的统一 Key/API 通道把多环境密钥管理收拢起来少踩配置漂移的坑。下面按「先跑通数据层 → 再配 SSL → 再验证请求 → 最后排错」的顺序来每一步都给可复制的代码和命令你跟着敲就行。2. 前置准备TaoToken 统一 Key 与环境变量收口在动手配 SSL 之前先把密钥管理这件事解决掉不然后面证书路径、数据库密码、接口鉴权 token 全混在一起排错会很痛苦。TaoToken 在这里的角色是统一 Key/API 通道你可以在一个控制台里管理不同环境要用的密钥前端、后端、脚本都从同一个来源取避免「开发一套、线上一套」写死在代码里。具体操作路径是这样的。先打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 了解整体能力然后进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建你的项目。在项目里生成 API Key这个 Key 就是你后面在 koa 里读取的凭证。如果你还要做模型对话相关的调试可以顺带看下模型对话入口 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 不过本篇重点是 CRUD 和 SSL模型部分先放一边。生成 Key 之后建议在 koa 项目根目录建一个.env文件配合 dotenv 使用把不同环境的配置分开写# .env.development NODE_ENVdevelopment PORT3000 MONGO_URImongodb://localhost:27017/test_alioss TAOTOKEN_API_KEYsk-dev-xxxxxxxx # .env.production NODE_ENVproduction PORT4004 MONGO_URImongodb://admin:123456localhost:27017/test_alioss?authSourceadmin TAOTOKEN_API_KEYsk-prod-xxxxxxxx SSL_KEY_PATHssl/your_domain.key SSL_CERT_PATHssl/your_domain.pem这里有个关键点线上 MongoDB 连接串一定要带?authSourceadmin因为 mongodb 的用户名密码是存在 admin 库里的不带这个参数会认证失败。另外连接串不要用模板字符串拼接直接写死字符串否则线上环境容易报错。API Key 从 TaoToken 控制台拿接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 需要查参数的时候翻一下。如果你后面要做长期编码或者 Agent 类的自动化任务可以了解下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合持续性的开发场景。但就本篇的 CRUD 来说一个 API Key 加环境变量就够了。3. 可复制配置koa https 启动骨架 mongoose SSL 连接串3.1 koa 侧 https 启动骨架先装依赖。注意koa-sslify的引入方式是.default这个坑很多人踩cnpm i -S https koa-sslify dotenv然后写app.js。这里我把开发和生产环境分开处理生产环境用 https 启动开发环境用 http避免本地还要配证书const Koa require(koa) const app new Koa() const json require(koa-json) const onerror require(koa-onerror) const bodyparser require(koa-bodyparser) const logger require(koa-logger) const https require(https) const sslify require(koa-sslify).default const fs require(fs) const path require(path) require(dotenv).config({ path: process.env.NODE_ENV production ? .env.production : .env.development }) const index require(./routes/index) const user require(./routes/user) onerror(app) app.use(bodyparser({ enableTypes: [json, form, text] })) app.use(json()) app.use(logger()) app.use(require(koa-static)(__dirname /public)) app.use(async (ctx, next) { const start new Date() await next() const ms new Date() - start console.log(${ctx.method} ${ctx.url} - ${ms}ms) }) app.use(index.routes(), index.allowedMethods()) app.use(user.routes(), user.allowedMethods()) app.on(error, (err, ctx) { console.error(server error, err, ctx) }) if (process.env.NODE_ENV production) { console.log(当前环境production) app.use(sslify()) const options_ssl { key: fs.readFileSync(path.resolve(__dirname, process.env.SSL_KEY_PATH)), cert: fs.readFileSync(path.resolve(__dirname, process.env.SSL_CERT_PATH)) } const port_https Number(process.env.PORT) || 4004 https.createServer(options_ssl, app.callback()).listen(port_https, (err) { if (err) { console.log(server error: , err) } else { console.log(服务端地址https://your-domain:${port_https}) } }) } else { const port Number(process.env.PORT) || 3000 app.listen(port, () { console.log(当前环境development) console.log(服务端地址http://localhost:${port}) }) } module.exports app这里有个实测经验早期我用https.createServer(...).listen()的时候遇到过端口监听不上的情况后来改成先判断环境、再分别 listen并且每次改完配置手动重启 node 服务问题就没了。所以如果你发现接口请求不到先别怀疑代码重启一下服务试试。3.2 mongoose 连接串 SSL 参数写法db.js里根据环境切换连接串。线上如果 MongoDB 开了 SSL连接串要加ssltrue如果只是本地认证加authSourceadmin就够let mongoose require(mongoose) mongoose.set(useCreateIndex, true) mongoose.set(useNewUrlParser, true) mongoose.set(useUnifiedTopology, true) if (process.env.NODE_ENV production) { // 线上带认证 SSL mongoose.connect(process.env.MONGO_URI) } else { // 开发本地无认证 mongoose.connect(process.env.MONGO_URI) } mongoose.connection.on(open, err { if (err) { console.log(err) return } console.log(数据库连接成功) }) module.exports mongoose如果你的 MongoDB 是云托管且强制 SSL连接串长这样mongodb://admin:123456your-host:27017/test_alioss?authSourceadminssltrue注意mongodb://后面是两个斜杠别写成三个。另外authSourceadmin和ssltrue的顺序无所谓但都要带上。3.3 数据模型与 CRUD 路由models/User.jsconst mongoose require(../db.js) let UserSchema mongoose.Schema({ username: { type: String, required: true, unique: true }, password: String, date: { type: Date, default: Date.now } }) module.exports mongoose.model(User, UserSchema, user)routes/user.js把增删改查都覆盖了包括按_id和按username两种方式const router require(koa-router)() const User require(../models/User) router.prefix(/userManage) router.get(/, async (ctx) { let data await User.find({}) ctx.body { code: 200, message: 请求成功, data } }) router.post(/, async (ctx) { let { username, password } ctx.request.body await User.create({ username, password }) ctx.body { code: 200, message: 新增成功 } }) router.put(/:_id, async (ctx) { let { username, password } ctx.request.body let { _id } ctx.params await User.findByIdAndUpdate(_id, { username, password }) ctx.body { code: 200, message: 编辑成功 } }) router.put(/, async (ctx) { let { username, password } ctx.request.body await User.findOneAndUpdate({ username }, { password }) ctx.body { code: 200, message: 编辑成功 } }) router.delete(/, async (ctx) { let { username } ctx.request.body await User.findOneAndDelete({ username }) ctx.body { code: 200, message: 删除成功 } }) router.delete(/:_id, async (ctx) { let { _id } ctx.params await User.findByIdAndDelete(_id) ctx.body { code: 200, message: 删除成功 } }) router.post(/search, async (ctx) { let { searchName } ctx.request.body let data await User.find({ username: { $regex: searchName } }) ctx.body { code: 200, message: 查询成功, data } }) module.exports router3.4 nginx 反代与 SSL 证书nginx 这块负责把 443 的 https 请求转给 koa 的 4004同时托管 uniapp 打包后的静态文件。证书文件.pem是 Base64 编码的 PEM 文本.key是私钥两个都要放到服务器上server { listen 443 ssl; ssl_certificate /etc/nginx/ssl/your_domain.pem; ssl_certificate_key /etc/nginx/ssl/your_domain.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /opt/git_uniapp_koa2_mongoose/dist; try_files $uri $uri/ /index.html; } location /api { rewrite ^.api/?(.*)$ /$1 break; proxy_pass https://your-domain:4004; } } server { listen 80; location / { root /opt/git_uniapp_koa2_mongoose/dist; try_files $uri $uri/ /index.html; } location /api { rewrite ^.api/?(.*)$ /$1 break; proxy_pass https://your-domain:4004; } }try_files $uri $uri/ /index.html;这行必须加否则 uniapp 打包后刷新页面会 404。另外记得在云服务器安全组里开放 443、80、4004 端口少开一个都连不上。4. 验证请求curl 打通 CRUD 与 https配置写完别急着开前端先用 curl 把后端接口验证一遍。开发环境# 新增 curl -X POST http://localhost:3000/userManage \ -H Content-Type: application/json \ -d {username:test01,password:123456} # 查询全部 curl http://localhost:3000/userManage # 按用户名改密码 curl -X PUT http://localhost:3000/userManage \ -H Content-Type: application/json \ -d {username:test01,password:newpass} # 按用户名删除 curl -X DELETE http://localhost:3000/userManage \ -H Content-Type: application/json \ -d {username:test01}生产环境换成 https 域名和 4004 端口curl -X POST https://your-domain:4004/userManage \ -H Content-Type: application/json \ -d {username:prod01,password:123456} curl https://your-domain:4004/userManage如果 https 返回curl: (60) SSL certificate problem说明证书链没配全或者域名不匹配检查.pem是不是完整证书链。如果返回 502说明 nginx 转发到了 4004 但 koa 没起来去服务器上看 node 进程和日志。成功的话你会看到{code:200,message:请求成功,data:[...]}这样的 JSON。前端 uniapp 这边baseUrl按环境切换data() { return { baseUrl: process.env.NODE_ENV production ? https://your-domain:4004 : http://localhost:3000 } }请求方法用uni.requestheader 里content-type设成application/x-www-form-urlencoded或application/json都行但要和 koa 的 bodyparser 对得上。小程序端还要在微信公众平台配置服务器合法域名把https://your-domain:4004加进去否则真机上请求会被拦。5. 本篇常见错排查端口监听不上最常见的原因是改完配置没重启 node 服务。另外检查process.env.PORT有没有被覆盖Number()转换一下更稳。https 请求 502nginx 的proxy_pass指向的端口和 koa 实际监听端口不一致或者 koa 进程挂了。先curl本地 4004 确认 koa 活着再看 nginx error log。mongoose 认证失败线上连接串漏了?authSourceadmin或者用户名密码写错。注意连接串别用模板字符串拼直接写字符串。小程序请求被拦合法域名没配或者发布时勾了「不校验合法域名」。发布前取消勾选用备案域名访问。页面刷新 404nginx 里漏了try_files $uri $uri/ /index.html;。本地请求不了先清浏览器缓存很多时候是缓存导致的。还不行就检查 koa 是不是真的在 3000 端口监听。证书报错.pem和.key路径写错或者证书和域名不匹配。用在线 SSL 检测工具查一下证书链是否完整。6. 密钥与接入统一收口整条链路跑通之后你会发现真正容易出问题的不是 CRUD 代码而是环境切换时的配置管理。开发用一套 Key、线上一套 Key证书路径、数据库密码、接口鉴权 token 散在各处改一次要翻好几个文件。把 API Key 统一放到 TaoToken 控制台管理接入时从环境变量读取能省掉很多「本地好好的线上挂了」的排查时间。需要生成和管理 Key 的话直接进 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入细节查文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你后面要接 Claude Code 这类编码工具Anthropic 兼容入口在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentClaudeCodeAnthropicutm_campaignrewrite 不过那是另一条线了本篇的 CRUD 和 SSL 先用上面这套配置跑起来再说。最后提醒一句每次改完 nginx 配置记得nginx -t测试语法再nginx -s reload重载改完 koa 代码记得重启 node。这两个动作看着简单但十次里有八次的问题都是忘了做其中一步。
返回列表