Back to skills
SKILL.md
Collection
ASecurityNode.js/Express/TypeScript microservices development. Layered architecture (routes → controllers → services → repositories), BaseController, error handling, Sentry monitoring, Prisma, Zod validation, dependency injection. USE WHEN creating routes, controllers, services, repositories, middleware, API endpoints, database access, error tracking.
- 24 stars
- 0 votes
- 0 copies
- 2 views
- Added September 8, 2026
Works with
Security analysis
100/100Pro scans all 21 files and shows the line behind each finding
npx -y skills add mattnigh/skills_collection --skill collection --agent claude-codeAre you the author of Collection?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/mattnigh-collection-3d6bb993)---
name: backend-dev-guidelines
description: Node.js/Express/TypeScript microservices development. Layered architecture (routes → controllers → services → repositories), BaseController, error handling, Sentry monitoring, Prisma, Zod validation, dependency injection. USE WHEN creating routes, controllers, services, repositories, middleware, API endpoints, database access, error tracking.
---
## When to Use
Creating routes, controllers, services, repositories, middleware, APIs, database queries, error handling.
## Quick Checklist
**New API Endpoint:**
- Route in `routes/` with verb naming (`getUser`, `createProduct`)
- Controller extends `BaseController`
- Service in `services/` with business logic
- Repository in `repositories/` with Prisma queries
- Zod validation for request data
- Error handling with `AppError`
- Sentry integration for monitoring
## Layered Architecture
```
Route → Controller → Service → Repository → Database
↓ ↓ ↓
Validation Business Data Access
Logic
```
**Responsibilities:**
- **Routes**: Define endpoints, attach middleware
- **Controllers**: Handle HTTP (req/res), validation
- **Services**: Business logic, orchestration
- **Repositories**: Database queries only
## BaseController Pattern
```ts
class BaseController {
ok(res, data?) { return res.status(200).json(data); }
created(res, data) { return res.status(201).json(data); }
noContent(res) { return res.status(204).send(); }
badRequest(res, message) { return res.status(400).json({ error: message }); }
notFound(res, message) { return res.status(404).json({ error: message }); }
}
```
## Error Handling
```ts
class AppError extends Error {
constructor(message: string, public statusCode: number = 500) {
super(message);
}
}
// Throw in service
throw new AppError('User not found', 404);
// Global handler
app.use((err, req, res, next) => {
Sentry.captureException(err);
res.status(err.statusCode || 500).json({
error: err.message || 'Internal server error',
});
});
```
## Validation with Zod
```ts
import { z } from 'zod';
const createUserSchema = z.object({
email: z.string().email(),
name: z.string().min(2),
age: z.number().min(18).optional(),
});
// In controller
const data = createUserSchema.parse(req.body); // Throws if invalid
```
## Dependency Injection
```ts
// Container
const userRepo = new UserRepository();
const userService = new UserService(userRepo);
const userController = new UserController(userService);
// Register routes
router.get('/users/:id', asyncHandler((req, res) =>
userController.getUser(req, res)
));
```
## Async Handler Wrapper
```ts
const asyncHandler = (fn) => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};
router.get('/users', asyncHandler(async (req, res) => {
const users = await userService.getAll();
res.json(users);
}));
```
## Sentry Integration
```ts
import * as Sentry from '@sentry/node';
Sentry.init({ dsn: process.env.SENTRY_DSN });
// Auto-capture errors
app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.errorHandler());
// Manual capture
try {
await riskyOperation();
} catch (error) {
Sentry.captureException(error);
throw error;
}
```
## Middleware Pattern
```ts
// Auth middleware
const authMiddleware = async (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) return res.status(401).json({ error: 'Unauthorized' });
try {
req.user = await verifyToken(token);
next();
} catch {
res.status(401).json({ error: 'Invalid token' });
}
};
router.use('/protected', authMiddleware);
```
## TypeScript Tips
```ts
// DTOs
interface CreateUserDto {
email: string;
name: string;
age?: number;
}
// Service return types
async getById(id: string): Promise<User | null> {}
// Strict null checks
const user = await repo.findById(id);
if (!user) throw new AppError('Not found', 404);
return user; // TS knows user is not null here
```
## File Organization
```
src/
├── routes/
│ └── user.routes.ts
├── controllers/
│ └── UserController.ts
├── services/
│ └── UserService.ts
├── repositories/
│ └── UserRepository.ts
├── middleware/
│ └── auth.middleware.ts
├── types/
│ └── user.types.ts
└── utils/
├── AppError.ts
└── asyncHandler.ts
```
---
---
## References
**Quick Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/quick-patterns.md`
**Prisma Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/prisma-patterns.md`
**Common Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/common-patterns.md`
Files in this skill
- 0Chan-smc__claude-code-workflow-lab__claude__skills__frontend-dev-guidelines__SKILL.md
- 17hz__nextjs-template__claude__skills__example-skill__SKILL.md
- 1ambda__dataops-platform__claude__skills__context-synthesis__SKILL.md
- 1natsu172__dotfiles__claude__skills__git-analysis__SKILL.md
- 1natsu172__dotfiles__claude__skills__github-pr-best-practices__SKILL.md
- 23Maestro__prospect-pipeline__claude__skills__npid-fastapi-skill.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-code-javascript__SKILL.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-code-python__SKILL.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-expression-syntax__SKILL.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-mcp-tools-expert__SKILL.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-node-configuration__SKILL.md
- 360AYA25__ClaudeN8N__claude__skills__n8n-workflow-patterns__SKILL.md
- 3x-Projetos__claude-memory-framework__claude__skills__scientist__SKILL.md
- 5MinFutures__futures-arena__claude__skills__migration-tracker__SKILL.md
- 5MinFutures__futures-arena__claude__skills__planning-guidelines__SKILL.md
- 92Bilal26__TaskPilotAI__claude__skills__assessment-builder__SKILL.md
- 92Bilal26__TaskPilotAI__claude__skills__book-scaffolding__SKILL.md
- 92Bilal26__TaskPilotAI__claude__skills__code-validation-sandbox__SKILL.md
- 92Bilal26__TaskPilotAI__claude__skills__exercise-designer__SKILL.md
- 92Bilal26__TaskPilotAI__claude__skills__learning-objectives__SKILL.md
Attribution
Comments
Loading comments…