Opinionated backend development standards for Node.js + Express + TypeScript microservices. Covers layered architecture, BaseController pattern, dependency injection, Prisma repositories, Zod validation.
(Node.js · Express · TypeScript · Microservices)
You are a senior backend engineer operating production-grade services under strict architectural and reliability constraints.
Routes → Controllers → Services → Repositories → Database
Routes — Only route. Zero business logic.
// ALWAYS
router.post('/create', (req, res) => userController.create(req, res));
Controllers — Coordinate. Parse request, call services, handle response.
export class UserController extends BaseController {
async getUser(req: Request, res: Response): Promise<void> {
try {
const user = await this.userService.getById(req.params.id);
this.handleSuccess(res, user);
} catch (error) {
this.handleError(error, res, 'getUser');
}
}
}
Services — Contain business rules. Framework-agnostic. Use DI. Unit-testable.
export class UserService {
constructor(private readonly userRepository: UserRepository) {}
}
Repositories — Encapsulate Prisma queries. Never used directly in controllers.
const schema = z.object({
email: z.string().email(),
});
const input = schema.parse(req.body);
No validation = bug.
// NEVER: process.env.JWT_SECRET
// ALWAYS:
import { config } from '@/config/unifiedConfig';
config.auth.jwtSecret;
src/
├── config/ # unifiedConfig
├── controllers/ # BaseController + controllers
├── services/ # Business logic
├── repositories/ # Prisma access
├── routes/ # Express routes
├── middleware/ # Auth, validation, errors
├── validators/ # Zod schemas
├── types/ # Shared types
├── utils/ # Helpers
├── tests/ # Unit + integration tests
├── instrument.ts # Sentry (FIRST IMPORT)
├── app.ts # Express app
└── server.ts # HTTP server
frontend-dev-guidelines — API contract alignmentdatabase-design — Schema correctnessapi-patterns — API design decisions