返回 Skill 列表
extension
分类: 开发与工程无需 API Key

integrate-routes

在app.ts中使用依赖注入挂载路由。在创建路由后使用,将它们连接到应用程序中。触发关键词包括“挂载路由”、“添加到应用”、“连接路由”、“集成路由”。

person作者: jakexiaohubgithub

Integrate Routes

Mounts newly created routes into src/app.ts with proper dependency injection chain.

Quick Reference

File to modify: src/app.ts When to use: After creating routes with create-routes skill

Prerequisites

Before integrating routes, ensure you have:

  1. Schema created (src/schemas/{entity}.schema.ts)
  2. Repository implementation (src/repositories/mockdb/{entity}.mockdb.repository.ts)
  3. Service created (src/services/{entity}.service.ts)
  4. Controller created (src/controllers/{entity}.controller.ts)
  5. Routes created (src/routes/{entity}.router.ts)

Instructions

Step 1: Add Imports

Add imports at the top of src/app.ts:

// Route factory
import { create{Entity}Routes } from "@/routes/{entity-name}.router";

// Controller
import { {Entity}Controller } from "@/controllers/{entity-name}.controller";

// Service
import { {Entity}Service } from "@/services/{entity-name}.service";

// Repository (choose one based on environment)
import { MockDb{Entity}Repository } from "@/repositories/mockdb/{entity-name}.mockdb.repository";
// OR for production:
// import { MongoDb{Entity}Repository } from "@/repositories/mongodb/{entity-name}.mongodb.repository";

Step 2: Create Dependency Chain

Add the dependency instantiation in the appropriate section of app.ts:

// =============================================================================
// {Entity} Resource Dependencies
// =============================================================================
const {entity}Repository = new MockDb{Entity}Repository();
// OR for production: const {entity}Repository = new MongoDb{Entity}Repository();

const {entity}Service = new {Entity}Service({entity}Repository);
const {entity}Controller = new {Entity}Controller({entity}Service);

Step 3: Mount Routes

Add the route mounting after other routes:

// =============================================================================
// Routes
// =============================================================================
// ... existing routes ...

// {Entity} routes
app.route("/{entities}", create{Entity}Routes({ {entity}Controller }));

Step 4: Verify Order

Ensure the following order in app.ts:

  1. Imports
  2. App creation (const app = new Hono<AppEnv>())
  3. Global middleware (CORS, etc.)
  4. Dependency instantiation
  5. Route mounting
  6. Error handler (app.onError(globalErrorHandler))
  7. Export

Patterns & Rules

Dependency Chain Order

Always create dependencies in this order:

// 1. Repository (lowest level)
const repository = new MockDbEntityRepository();

// 2. Service (depends on repository)
const service = new EntityService(repository);

// 3. Controller (depends on service)
const controller = new EntityController(service);

// 4. Routes (depends on controller)
app.route("/entities", createEntityRoutes({ entityController: controller }));

Route Path Convention

  • Use plural for entity routes: /notes, /users, /projects
  • Use kebab-case for multi-word: /course-registrations
  • Match the entity name (singular) to path (plural)

Environment-Based Repository

For production-ready code, use environment-based selection:

import { env } from "@/env";
import { MockDbNoteRepository } from "@/repositories/mockdb/note.mockdb.repository";
import { MongoDbNoteRepository } from "@/repositories/mongodb/note.mongodb.repository";

const noteRepository =
  env.NODE_ENV === "production"
    ? new MongoDbNoteRepository()
    : new MockDbNoteRepository();

Grouping Dependencies

Group related dependencies with comments:

// =============================================================================
// Note Resource
// =============================================================================
const noteRepository = new MockDbNoteRepository();
const noteService = new NoteService(noteRepository);
const noteController = new NoteController(noteService);

// =============================================================================
// Project Resource
// =============================================================================
const projectRepository = new MockDbProjectRepository();
const projectService = new ProjectService(projectRepository);
const projectController = new ProjectController(projectService);

Complete Example

import { Hono } from "hono";
import { cors } from "hono/cors";
import type { AppEnv } from "@/schemas/app-env.schema";
import { globalErrorHandler } from "@/errors";

// Route factories
import { createNoteRoutes } from "@/routes/note.router";
import { createProjectRoutes } from "@/routes/project.router";
import { createEventsRoutes } from "@/routes/events.router";

// Controllers
import { NoteController } from "@/controllers/note.controller";
import { ProjectController } from "@/controllers/project.controller";

// Services
import { NoteService } from "@/services/note.service";
import { ProjectService } from "@/services/project.service";

// Repositories
import { MockDbNoteRepository } from "@/repositories/mockdb/note.mockdb.repository";
import { MockDbProjectRepository } from "@/repositories/mockdb/project.mockdb.repository";

// =============================================================================
// App Setup
// =============================================================================
const app = new Hono<AppEnv>();

// Global middleware
app.use("*", cors());

// =============================================================================
// Note Resource
// =============================================================================
const noteRepository = new MockDbNoteRepository();
const noteService = new NoteService(noteRepository);
const noteController = new NoteController(noteService);

// =============================================================================
// Project Resource
// =============================================================================
const projectRepository = new MockDbProjectRepository();
const projectService = new ProjectService(projectRepository);
const projectController = new ProjectController(projectService);

// =============================================================================
// Routes
// =============================================================================
app.route("/notes", createNoteRoutes({ noteController }));
app.route("/projects", createProjectRoutes({ projectController }));
app.route("/", createEventsRoutes());

// =============================================================================
// Error Handler
// =============================================================================
app.onError(globalErrorHandler);

export { app };

Troubleshooting

Route Not Found (404)

  • Check the path prefix matches your request
  • Verify routes are mounted before the error handler
  • Check for typos in route path

Type Errors

  • Ensure controller is passed with correct property name
  • Verify all imports use correct casing
  • Check that route factory expects the correct dependency interface

Circular Dependencies

  • Never import app.ts from other modules
  • Keep dependency chain one-directional
  • Use interface imports (import type) where possible

What NOT to Do

  • Do NOT mount routes after app.onError()
  • Do NOT create dependencies inside route handlers
  • Do NOT use require() - use ES modules
  • Do NOT hardcode repository implementations - use DI
  • Do NOT forget to export the app

See Also

  • create-routes - Creating the route factory
  • create-controller - Creating the controller
  • create-resource-service - Creating the service
  • create-resource - Complete resource workflow