第14课 - MCP服务器
📑 摘要
- 🧩 创建路线 - 📦 创建控制器 - ⛓️ 创建中间件 - 💻 创建命令 - 📦 项目迁移 - 🌱 项目种子
______________________________________________________________________
安装和运行
按照以下步骤通过 Docker 运行项目:
- 克隆仓库 :
git clone https://github.com/luan-tavares/unifaat-frontend-project- 进入工程文件夹 :
cd unifaat-frontend-project- 创建文件
.env复制到项目根.env.example:
> 无窗口:
copy .env.example .env> 没有Linux:
cp .env.example .env- 打开文件
.env新创建并填写以下字段:
POSTGRES_PASSWORD=123456
JWT_SECRET=segredo- 安装依赖关系 :
npm install- 在新终端中,运行预编译器
npm run watch- 使用Docker Compose上传应用程序:
> Docker传统作曲:
docker-compose up --build> Docker编写现代版:
docker compose up --build- 使用以下命令之一执行迁移:
> 容器(Docker Compose传统):
docker-compose run --rm nodecli-container migrate> 容器(Docker Compose moderno):
docker compose run --rm nodecli-container migrate> 主持人:
node command migrate- 使用以下命令之一运行种子 :
> 容器(Docker Compose传统):
docker-compose run --rm nodecli-container seed> 容器(Docker Compose moderno):
docker compose run --rm nodecli-container seed> 主持人:
node command seed- 在主机上全局安装螺丝并运行( 可选)
npm install -g vitevite______________________________________________________________________
访问
- Nginx服务器: http://localhost:8080
- API 文档: http://localhost:8080/docs
- Servidor Vite: http://localhost:5173
重要提示: 文件 ./Insomnia.yml 它应该用于失眠测试路线。
______________________________________________________________________
🚀 如何创建元素
🧩 创建路线
- 设定路径路径为
routes/web.js或routes/api.js - 将控制器关联到
app/Http/Controllers/
例子(routes/api.js):
router.get('/exemplo', MeuController);📦 创建控制器
- 在创建新文件
app/Http/Controllers/...
export default async function(request, response) {
...
# Minha Lógica
...
response.status(200).json({"success": "Minha resposta"});
}⛓️ 创建中间件
添加到 app/Http/Middlewares/例如:
export default async function (request, response, next) {
console.log(`[${request.method}] ${request.url}`);
next();
}然后在路线上注册。
💻 创建命令
- 创建文件于
app/Commands/NomeDoCommand.js:
export default {
name: 'nome-comando',
description: 'minha descrição',
arguments: {
...
},
handle: async function ({ argument1 }) {
console.log(argument1);
...
# Minha lógica
...
}
}- 通过终端执行:
node command meu-comando______________________________________________________________________
📦 项目迁移
此项目的迁移负责以递增和日期排序的方式对数据库结构进行版本化。
📁 位置
所有迁移文件都保存在:
./database/migrations📄 文件格式
每个迁移都遵循以下命名模式:
YYYY_MM_DD_HH_MM_SS_nome_descritivo.js例如:
2025_06_07_00_00_00_create_roles_table.js🧬 代码结构
每个迁移导出两种异步方法: up() e down().
import db from '../../config/db.js';
async function up() {
await db.query(`
CREATE TABLE IF NOT EXISTS roles (
id SERIAL PRIMARY KEY,
nome VARCHAR(155) UNIQUE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
`);
}
async function down() {
await db.query(`DROP TABLE roles;`);
}
export default { up, down };🛠 如何创建新的迁移
- 在开头设置描述性名称和当前时间
- 实现函数
up()edown() - 文件另存为
./database/migrations
🚀 执行迁移
执行是通过CLI完成的,并遵守时间戳顺序。
✅ 良好做法
- 按变更迁移
- 始终执行
down() - 不更改旧迁移
______________________________________________________________________
🌱 项目种子
种子是负责用初始或测试数据流行数据库的脚本。
📁 位置
./database/seeds/🧾 档案名称
001_roles_and_users.js
002_outra_seed.js
...🧬 文件结构
import bcrypt from 'bcrypt';
import UserModel from '../../app/Models/UserModel.js';
export default {
up: async () => {
const senha = "123456";
await UserModel.bulkCreate([
{ nome: 'User1', email: 'user1@example.com', id_role: rows[0].id, senha: await bcrypt.hash(senha, 10) },
{ nome: 'User2', email: 'user2@example.com', id_role: rows[1].id, senha: await bcrypt.hash(senha, 10) },
])
},
down: async () => {
await UserModel.destroy({
where: {
email: ['user1@example.com', 'user2@example.com']
}
});
}
};⚠️ 重要
像迁移和种子一样执行。
🚀 执行 Seeds
排序文件并运行 up()通过回滚支持 down().
✅ 良好做法
- 每种子的小范围
- 始终执行
down() - 不要重复使用电子邮件/名称
- 不要在生产逻辑中使用
______________________________________________________________________
📦 使用的库
图书馆目的 |-----------------------|----------------------------------------------------------------------------| | express 用于创建API和HTTP服务器的Node.js网络框架。 | | chalk 图书馆以颜色和强调在终端的输出风格。 | | dotenv 从文件加载环境变量 .env 段落 process.env. | | pg Node.js 的 PostgreSQL 客户端,用于连接和执行查询。 | | sequelize ORM (Object-Relational Mapping) 对象关系映射 | | jsonwebtoken 生成和验证用于身份验证的JWT令牌。 | | bcrypt 加密和安全哈希密码比较。 | | swagger-jsdoc 从代码注释中的 JSDoc 生成 Swagger 规范。 | | swagger-ui-express 中间件,用于 Swagger 用户界面来记录和测试 API。 | | express-fileupload | 中间件来处理文件上传通过 multipart/form-data. | | minimist 解析命令行参数。 | | cli-table3 创建在终端中显示的格式化表。 | | axios 用于向外部 API 发出请求的 HTTP 客户端。 | | amqplib 通过 AMQP 协议与 RabbitMQ 通信的客户端库。 | | nodemon 检测到更改时自动重新启动应用程序的工具。 | | vite 用于现代Web项目的HMR(Hot Module Replacement)开发服务器和捆绑器;快速启动并立即重新加载更改。 |
______________________________________________________________________
📁 目录结构(根)
| 路径/文件夹 | 描述 |
|---|---|
app/ 按域组织的应用程序的主要逻辑。 | |
app/Commands/ | Comandos命令行界面 migrate, seed, dispatch执行于 node command . |
app/Http/ 与HTTP请求相关的代码。 | |
app/Http/Controllers/ 处理路由请求和响应的控制器。 | |
app/Http/Middlewares/ 中间件,如身份验证,验证和HTTP记录器。 | |
app/Models/ 序列表示和操作数据库表格的模型。 | |
bootstrap/ 特定于项目的初始化,例如全局设置助手、常量和环境变量。 | |
config/ RabbitMQ、Postgres、JWT、Sequelize、Swagger等服务的配置文件。 | |
Core/ 系统的核心,就好像它是一个由我们自己创建的内部 lib。 | |
database/migrations/ 创建/修改版本化表的脚本。 | |
database/seeds/ 在银行流行的初始数据的脚本。 | |
docker/ 每个应用程序服务的特定Dockerfiles。 | |
docs/ | (可选) Swagger API JSON 文档。 |
node_modules/ 自动安装npm软件包。 | |
public/ 公共档案(如 index.html直接通过HTTP服务。 | |
routes/ 路由定义文件,通常按实体组织。 | |
storage/ 应用程序的上传、临时文件或辅助文件夹。 | |
.env 运行时加载的敏感环境变量。 | |
.env.example | 模板de .env 让新 devs 复制和配置 。 |
.gitignore Git 应该忽略的文件和文件夹列表。 | |
command | dos命令行界面入口(node command ...). |
docker-compose.yml 容器编排文件(web,worker,postgres,rabbit等)。 | |
Insomnia.yaml 导出用于导入Insomnia的API路径。 | |
package.json 依赖列表、npm 脚本和项目元数据。 | |
package-lock.json 锁定已安装的依赖关系的确切版本。 | |
readme.md 项目的主要文档(此文件)。 | |
server.js 应用程序的 HTTP 入口点。启动 Express 并启动 API。 |
______________________________________________________________________
🧾 如何创建新的 Swagger 文档
该项目使用 Swagger 以模块化方式记录 API。每个端点组都有一个文件 .js 目录内 docs/它们都是动态地联系在一起的。 SwaggerCore.
🗂 预期结构
docs/
├── 01-loginDoc.js
├── 02-colaboradorDoc.js
├── ...🧑💻 创建新文档文件
- 以数字前缀和后缀命名文件
Doc.js - 以 OpenAPI 格式(Swagger 3.0)导出对象
- 文件另存为
./docs/ - Swagger 将自动挂载
______________________________________________________________________
🐳 容器和 Docker 映像
🔧 应用程序容器
| 容器 | Dockerfile | 功能 | 内部端口 |
|---|---|---|---|
nodeweb-container | docker/node24-web/Dockerfile.dev | API HTTP主体(server.js). | 3000 |
nodecli-container | docker/node24-cli/Dockerfile 执行命令如 migrate, seed, dispatch短暂的集装箱。 | ||
nodevitehmr-container | docker/node24-vite-hmr/Dockerfile | HMR Vite服务器 | 5173 |
nodevitecompiler-container | docker/node24-vite-compiler/Dockerfile | JS预编译器 |
🗄️ 基础设施容器
| 容器 | 基本图像 | 功能 | 内部门 |
|---|---|---|---|
postgres-container | postgres:15 应用程序使用的 PostgreSQL 数据库。5432 。 | ||
nginx-container | nginx:1.25-alpine 反向代理,将HTTP API暴露出来。80 。 |
💾 恒定体积
| 使用 | 目的 | |
|---|---|---|
nodemodules-aula04-volume | nodeweb, nodecli, nodevite 避免在每个构建中重新安装依赖关系。 | |
pgdata-aula04-volume | postgres-container | PostgreSQL数据库的持久性 |
🌐 网络
所有容器都连接到自定义 Docker 网络:
app-network🌍 户外露出的门
| 服务 | 内部门 | 外部门 | 外部访问 |
|---|---|---|---|
| NGINX | 80 | 8080 | http://localhost:8080 |
| PostgreSQL | 5432 | 6789 | usado por客户端(养蜂人、dbeaver等)/ORM/CLI |
| 节点Vite HMR | 5173 | 5173 | http://localhost:5173 |
