ARTICLE DETAIL

资讯详情

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

Nestjs 网盘后端环境搭建:Mongodb、Redis、Swagger 一次配好并接入 TaoToken

Nestjs 网盘后端环境搭建:Mongodb、Redis、Swagger 一次配好并接入 TaoToken 1. Nestjs 网盘后端环境搭建从零跑通 Mongodb、Redis 与 Swagger做网盘项目最烦的不是写业务而是环境还没跑起来就先被数据库、缓存、接口文档三件事拖住。我这次用 Nestjs 搭一个网盘后端目标很明确Mongodb 存文件元数据、Redis 做热点缓存、Swagger 自动生成接口文档最后把模型调用统一走 TaoToken 的 Key/API 通道省得以后到处散落配置。整套流程在本地用 Docker Compose 起服务一条命令拉起适合刚学 Nestjs 想练手、又不想在环境上耗一整天的同学。这篇会给出可直接复制的docker-compose.yml、Mongoose 连接配置、Redis 缓存模块和 Swagger 初始化代码每一步都有启动验证和访问检查。你跟着敲完http://localhost:3000/api能看到接口文档Mongodb 和 Redis 都能连上模型调用配置也集中到一处。下面按顺序来遇到报错先别慌第五节专门列了常见坑。2. 用 Docker Compose 起 Mongodb 与 Redis 并接入 TaoToken 前置准备先说清楚为什么要用 TaoToken。网盘项目后面大概率要接 OCR 识别、文件摘要、图片标签这类模型能力如果每个功能各自配一套 Key 和 Base URL改起来就是灾难。TaoToken 提供统一的 Key/API 通道把模型调用配置收敛到一个地方换模型、换通道只改一处。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置时别写错。前置准备分三块Docker 环境、Node 环境、TaoToken 账号。Docker Desktop 装好并确认docker --version能输出Node 建议 18 以上包管理器我用 pnpm你用 npm 也行命令对应换一下。TaoToken 这边先去控制台拿 Key路径是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Key 在 API Keys 页面生成地址 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。拿到 Key 先别急着写进代码后面统一放环境变量。这里有个容易忽略的点Mongodb 和 Redis 的端口别和本机已有服务冲突。27017 和 6379 是最常见的占用端口如果你本机已经装过 Mongodb先停掉或者改映射端口。我习惯在 Compose 里把宿主机端口写成 27018 和 6380避免和系统服务打架容器内部还是标准端口连接字符串改宿主机端口即可。数据卷一定要挂出来网盘项目的文件元数据丢了很麻烦挂载到本地目录方便备份和迁移。TaoToken 的模型调用配置建议单独放一个config/ai.config.ts从环境变量读 Key 和 Base URL这样本地和服务器用同一套代码只换.env文件。别把 Key 硬编码进仓库.env加进.gitignore。如果你后面要用 Claude Code 这类编码工具TaoToken 也支持对应的接入方式文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 需要的话照着配。3. 可复制的 docker-compose.yml 与 Nestjs 连接配置先建项目nest new merikle-pan-backed包管理器选 pnpm。然后在项目根目录建docker-compose.yml内容如下直接复制version: 3.8 services: mongodb: image: mongo:6.0 container_name: pan_mongodb restart: always ports: - 27018:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin123 volumes: - ./data/mongo:/data/db networks: - pan_net redis: image: redis:7-alpine container_name: pan_redis restart: always ports: - 6380:6379 command: redis-server --appendonly yes volumes: - ./data/redis:/data networks: - pan_net networks: pan_net: driver: bridge启动docker compose up -d然后docker ps确认两个容器都是 Up 状态。Mongodb 用环境变量初始化了 root 账号比手动进容器建用户省事。Redis 开了 AOF 持久化网盘缓存重启不丢。接着装依赖pnpm i nestjs/mongoose mongoose redis nestjs/swagger。建数据库模块nest g lib db在libs/db/src/db.module.ts里写连接import { Global, Module } from nestjs/common; import { DbService } from ./db.service; import { MongooseModule } from nestjs/mongoose; Global() Module({ imports: [ MongooseModule.forRoot( mongodb://admin:admin123127.0.0.1:27018/pan?authSourceadmin, { autoIndex: true, autoCreate: true }, ), ], providers: [DbService], exports: [DbService], }) export class DbModule {}注意连接串里的authSourceadmin用 root 账号必须带不然会报认证失败。端口是 27018对应 Compose 里的宿主机映射。Redis 模块nest g lib redislibs/redis/src/redis.module.tsimport { Global, Module } from nestjs/common; import { RedisService } from ./redis.service; import { createClient } from redis; Global() Module({ providers: [ RedisService, { provide: REDIS_CLIENT, async useFactory() { const client createClient({ socket: { host: 127.0.0.1, port: 6380 }, }); await client.connect(); return client; }, }, ], exports: [RedisService], }) export class RedisModule {}redis.service.ts封装常用方法import { Inject, Injectable } from nestjs/common; import { RedisClientType } from redis; Injectable() export class RedisService { Inject(REDIS_CLIENT) private redisClient: RedisClientType; async get(key: string) { let value await this.redisClient.get(key); try { value JSON.parse(value); } catch (e) {} return value; } async set(key: string, value: any, second?: number) { value JSON.stringify(value); return await this.redisClient.set(key, value, { EX: second }); } async del(key: string) { return await this.redisClient.del(key); } async flushAll() { return await this.redisClient.flushAll(); } }Swagger 在main.ts初始化import { NestFactory } from nestjs/core; import { AppModule } from ./app.module; import { DocumentBuilder, SwaggerModule } from nestjs/swagger; async function bootstrap() { const app await NestFactory.create(AppModule); const config new DocumentBuilder() .setTitle(网盘后端 API) .setDescription(文件上传、下载、分享接口文档) .setVersion(1.0) .addBearerAuth() .build(); const document SwaggerModule.createDocument(app, config); SwaggerModule.setup(api, app, document); await app.listen(3000); } bootstrap();TaoToken 配置单独建src/config/ai.config.tsexport const aiConfig { baseURL: process.env.TAO_BASE_URL || https://taotoken.net/api, apiKey: process.env.TAO_API_KEY || , model: process.env.TAO_MODEL || gpt-4o-mini, };.env里写TAO_API_KEY你的KeyTAO_BASE_URLhttps://taotoken.net/api。这样模型调用配置就集中了后面接文件摘要功能直接读这个配置。4. 启动验证与 Swagger 接口文档访问检查配置写完先跑pnpm run start:dev。控制台看到 Nest 启动日志、没有 Mongoose 连接报错、Redis 没抛连接异常就算过了。如果 Mongoose 卡住多半是连接串或端口问题下一节细说。验证 Mongodb进容器docker exec -it pan_mongodb mongosh -u admin -p admin123 --authenticationDatabase admin然后show dbs能看到pan库首次连接可能还没建插入一条数据就会建。或者用 Compass 连mongodb://admin:admin123127.0.0.1:27018/pan?authSourceadmin图形化确认。验证 Redisdocker exec -it pan_redis redis-cli然后set test hello、get test返回 hello 就通了。项目里可以建个测试接口注入 RedisService调set(name, pan, 60)再get(name)控制台打印出来就说明封装没问题。验证 Swagger浏览器打开http://localhost:3000/api能看到标题「网盘后端 API」和接口列表。如果 404检查SwaggerModule.setup(api, app, document)这行有没有漏以及main.ts里有没有在listen之前调用。接口文档里点开任意接口能看到请求参数和响应结构addBearerAuth()会让文档出现 Authorize 按钮后面加 JWT 鉴权直接能用。验证 TaoToken 通道写个临时接口用fetch或 axios 请求https://taotoken.net/api对应的对话接口带上Authorization: Bearer 你的Key模型 ID 用gpt-4o-mini。返回正常内容就说明通道通了。想先在网页上试模型效果可以去 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 直接对话验证确认 Key 和模型 ID 没问题再写进代码。三个验证都过了环境就算搭好了。这时候你的 Nestjs 项目已经具备Mongodb 持久化、Redis 缓存、Swagger 文档、统一模型调用配置。后面写文件上传、分片、秒传这些业务基础设施不用再动。5. Nestjs 网盘后端常见报错排查401、连接失败与 Swagger 404Mongoose 报 Authentication failed连接串没带authSourceadmin或者账号密码和 Compose 里不一致。用 root 账号必须指定认证库。检查MONGO_INITDB_ROOT_USERNAME和连接串里的用户名是否一致。Mongoose 报 ECONNREFUSED 127.0.0.1:27017端口写错了。Compose 里映射的是 27018连接串要用 27018。如果你改了映射端口两边要对应。Redis 报 connect ECONNREFUSED同理Compose 映射 6380createClient里要写 6380。另外确认await client.connect()有没有加漏了这行连接不会建立。TaoToken 返回 401Key 没带对或者Authorization头格式错了。正确格式是Bearer 你的Key注意 Bearer 后面有空格。Key 从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 重新复制一份别带多余空格。如果报local proxy failed检查 Base URL 是不是写成了https://taotoken.net/api别多加斜杠或路径。Swagger 页面 404SwaggerModule.setup的路径和访问路径要一致写api就访问/api。另外确认main.ts里createDocument在setup之前调用顺序反了会拿不到文档。报 reading choices 错误这是模型响应结构解析问题通常是请求体格式不对或者模型 ID 写错。确认请求体里model字段和 TaoToken 支持的模型 ID 一致响应里choices取不到多半是返回了错误对象先打印完整响应看 message。OAuth 相关报错如果你用 Claude Code 或 Codex 接入认证方式走的是 OAuth 或 auth.json别和 API Key 混用。Claude Code 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content Codex 的auth.json配置也在同一份文档里照着填 Base URL、Key、Model ID 三件套。Docker 容器起不来docker compose logs mongodb看日志常见是端口被占用或数据卷权限问题。换端口或删掉./data重新起。Windows 下数据卷路径别用中文。6. 统一模型调用通道长期编码与 Agent 场景怎么选环境搭好只是开始网盘项目后面接模型能力时统一通道的价值会越来越明显。如果你只是偶尔调一下模型做文件摘要用 API Key 方式直接请求 https://taotoken.net/api 就够了配置简单按量用。如果你要长期做编码、跑 Agent 任务比如自动生成接口代码、批量处理文件标签那 Coding Plan 更合适入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 适合高频调用场景。我的建议是本地开发阶段先用 API Key 把通道跑通确认模型 ID 和请求格式没问题等业务稳定、调用量上来了再评估要不要换 Coding Plan。配置上两者都是改 Base URL 和 Key代码不用大动这也是统一通道的好处。最后留个实用技巧把 TaoToken 的配置和数据库、Redis 配置一样放环境变量本地.env、服务器.env.production分开代码里只读变量。这样你部署到服务器时只需要改.env里的地址和 Key不用动一行代码。Swagger 在生产环境记得关掉或者加鉴权别把接口文档暴露出去。Mongodb 和 Redis 的密码也别用示例里的 admin123换成强密码数据卷定期备份。这套环境跑通后你就可以专心写网盘的文件分片、秒传、分享这些核心逻辑了。
返回列表