Node.js Backend
Patterns and best practices for Node.js backend development with TypeScript.
Framework Selection
| Framework | Best For | Use When |
|---|
| Express | Simple APIs, flexibility | Quick setup, full control needed |
| NestJS | Enterprise, structured | Large teams, Angular-like structure |
| Fastify | Performance critical | High throughput, schema validation |
| Hono | Edge, lightweight | Cloudflare Workers, minimal overhead |
Reference Files
| Topic | Load | Use When |
|---|
| Project structure | references/project-structure.md | Setting up new project or organizing code |
| Express patterns | references/express-patterns.md | Building with Express |
| NestJS patterns | references/nestjs-patterns.md | Building with NestJS |
| Auth implementation | references/auth-patterns.md | Implementing authentication |
| Error handling | references/error-handling.md | Setting up error handling |
| Validation | references/validation.md | Input validation patterns |
Quick Start Patterns
Express Basic Setup
import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import { errorHandler } from './middleware/errorHandler';
import { routes } from './routes';
const app = express();
app.use(helmet());
app.use(cors());
app.use(express.json());
app.use('/api', routes);
app.use(errorHandler);
export { app };
NestJS Module Pattern
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}
TypeScript Configuration
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": "./src",
"declaration": true
}
}
Essential Packages
| Package | Purpose |
|---|
typescript | Type safety |
zod | Runtime validation |
bcrypt | Password hashing |
jsonwebtoken | JWT handling |
helmet | Security headers |
cors | CORS handling |
winston / pino | Logging |
prisma / drizzle | Database ORM |
Code Quality Rules
- Always use TypeScript - strict mode enabled
- Validate all inputs - use Zod or class-validator
- Handle all errors - never swallow exceptions
- Use async/await - no callback hell
- Environment variables - use dotenv, never hardcode secrets
- Logging - structured logs with correlation IDs