Kompletny Przewodnik - Rozmowa Rekrutacyjna Node.js Backend Developer 2026

Sławomir Plamowski 17 min czytania
backend express mongodb nestjs nodejs pytania-rekrutacyjne rest-api rozmowa-rekrutacyjna sql

Rozmowa na stanowisko Node.js Backend Developer w 2026 roku to nie jest już tylko "napisz CRUD w Express". To sprawdzian z całego ekosystemu - od głębokiej znajomości runtime'u, przez framework, bazy danych, po architekturę systemów i bezpieczeństwo. Kandydaci, którzy przychodzą znając tylko podstawy Express.js, odpadają na pytaniach o event loop czy streaming.

W tym przewodniku znajdziesz kompletną mapę tego, co sprawdzają rekruterzy na rozmowach backend Node.js, jakie pytania padają najczęściej, i jak się do nich przygotować. Każda sekcja zawiera linki do szczegółowych artykułów, gdzie znajdziesz konkretne pytania z odpowiedziami.

Co sprawdzają na rozmowie Node.js Backend Developer

Zanim zagłębimy się w szczegóły, musisz zrozumieć strukturę tego, co rekruterzy oceniają. Rozmowa Node.js Backend składa się z sześciu głównych obszarów:

Obszar Waga Co sprawdzają
Node.js Core 25-30% Event loop, streams, cluster, worker threads, modules
Framework 20-25% Express.js lub NestJS - zależnie od stanowiska
Bazy danych 20-25% MongoDB i/lub SQL (PostgreSQL, MySQL)
REST API & Design 10-15% Projektowanie API, wersjonowanie, HATEOAS
Architektura 10-15% Microservices, wzorce, skalowanie
Bezpieczeństwo & Auth 5-10% JWT, OAuth, OWASP, sanitization

Wagi różnią się między firmami. Startupy mogą kłaść większy nacisk na szybkie prototypowanie i znajomość frameworka. Korporacje często sprawdzają głębiej Node.js core i architekturę. Firmy fintech pytają więcej o bezpieczeństwo i bazy danych SQL. Ale Node.js core jest fundamentem wszędzie - bez zrozumienia jak działa event loop, cała reszta się wali.

Node.js Core - Fundament Każdej Rozmowy

Możesz być ekspertem od NestJS, ale jeśli nie potrafisz wyjaśnić jak działa event loop albo po co są streams, rozmowa skończy się szybko. Node.js core to fundament i rekruterzy zaczynają właśnie od niego.

Event Loop - Najważniejszy Temat

Event loop to serce Node.js. Musisz rozumieć nie tylko że "Node jest asynchroniczny", ale jak dokładnie to działa:

// Klasyczne pytanie: w jakiej kolejności wyświetlą się logi?
console.log('1 - sync');

setTimeout(() => console.log('2 - setTimeout'), 0);

setImmediate(() => console.log('3 - setImmediate'));

process.nextTick(() => console.log('4 - nextTick'));

Promise.resolve().then(() => console.log('5 - Promise'));

console.log('6 - sync');

// Odpowiedź: 1, 6, 4, 5, 2, 3 (lub 1, 6, 4, 5, 3, 2)
// Kolejność: sync → nextTick → microtasks (Promise) → timers → check (setImmediate)

Fazy event loop - musisz znać kolejność: timers → pending callbacks → idle/prepare → poll → check → close callbacks. I wiedzieć, gdzie wykonują się różne typy operacji.

process.nextTick vs setImmediate - nextTick wykonuje się przed każdą fazą event loop (przed microtasks!), setImmediate w fazie check. To częste pytanie pułapka.

Streams - Obsługa Dużych Danych

Streams to kluczowa koncepcja dla backendu. Zamiast ładować cały plik do pamięci, przetwarzasz dane kawałek po kawałku:

const fs = require('fs');
const zlib = require('zlib');

// Bez streams - zły sposób (cały plik w pamięci)
fs.readFile('huge-file.txt', (err, data) => {
  const compressed = zlib.gzipSync(data);
  fs.writeFileSync('huge-file.txt.gz', compressed);
});

// Ze streams - dobry sposób (małe zużycie pamięci)
fs.createReadStream('huge-file.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('huge-file.txt.gz'));

Typy streams - Readable, Writable, Duplex, Transform. Musisz wiedzieć kiedy użyć którego.

Backpressure - co się dzieje gdy producent generuje dane szybciej niż konsument je przetwarza? Jak to obsługuje Node.js?

Cluster i Worker Threads

Node.js jest single-threaded, ale możesz wykorzystać wiele rdzeni:

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker) => {
    console.log(`Worker ${worker.process.pid} died, spawning new one`);
    cluster.fork();
  });
} else {
  // Worker process - tu uruchamiasz serwer HTTP
  require('./server');
}

Cluster vs Worker Threads - cluster tworzy oddzielne procesy (izolacja pamięci, dobre dla HTTP), worker threads dzielą pamięć (dobre dla CPU-intensive tasks).

Moduły CommonJS vs ES Modules

// CommonJS (starszy, synchroniczny)
const express = require('express');
module.exports = { app };

// ES Modules (nowszy, asynchroniczny)
import express from 'express';
export { app };

Musisz znać różnice: kiedy używać którego, jak działa require cache, co to jest circular dependency i jak jej unikać.

Szczegółowe pytania z Node.js core z odpowiedziami: Jak Przygotować się do Rozmowy Node.js →

Express.js - Najpopularniejszy Framework

Express.js dominuje rynek Node.js backend. Jest minimalny, elastyczny i ma ogromny ekosystem middleware. Jeśli rekrutujesz na stanowisko z Express, musisz znać go dogłębnie.

Middleware - Serce Express

Middleware to funkcje, które mają dostęp do request, response i next. Wykonują się w kolejności dodania:

const express = require('express');
const app = express();

// Middleware logujący - dla wszystkich requestów
app.use((req, res, next) => {
  console.log(`${req.method} ${req.path} - ${Date.now()}`);
  next();
});

// Middleware parsujący JSON body
app.use(express.json());

// Middleware autoryzacji - tylko dla /api/*
app.use('/api', (req, res, next) => {
  const token = req.headers.authorization;
  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }
  // verify token...
  next();
});

// Route handler
app.get('/api/users', (req, res) => {
  res.json({ users: [] });
});

// Error handling middleware - MUSI mieć 4 argumenty!
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Something went wrong' });
});

Pytanie pułapka: Dlaczego error handling middleware musi mieć 4 argumenty? Bo Express rozpoznaje error handler po liczbie argumentów!

Routing i Struktura Aplikacji

// routes/users.js
const router = require('express').Router();

router.get('/', getAllUsers);
router.get('/:id', getUserById);
router.post('/', createUser);
router.put('/:id', updateUser);
router.delete('/:id', deleteUser);

module.exports = router;

// app.js
const usersRouter = require('./routes/users');
app.use('/api/users', usersRouter);

Popularne Pytania Express

  • Jak działa app.use() vs app.get()?
  • Jak obsłużyć async errors w Express?
  • Czym jest res.locals i kiedy go używać?
  • Jak zaimplementować rate limiting?
  • Jak obsłużyć CORS?

Szczegółowe pytania z Express.js z odpowiedziami: Express.js - Pytania Rekrutacyjne i Przewodnik →

NestJS - Enterprise Framework

NestJS to framework enterprise-level zbudowany na Express (lub Fastify). Wymusza strukturę, używa TypeScript, i implementuje wzorce znane z Angulara (DI, moduły, dekoratory). Jeśli rekrutujesz do korporacji lub dużego projektu, prawdopodobnie spotkasz NestJS.

Architektura NestJS

// users.module.ts
@Module({
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

// users.controller.ts
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll(): Promise<User[]> {
    return this.usersService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string): Promise<User> {
    return this.usersService.findOne(+id);
  }

  @Post()
  @UsePipes(new ValidationPipe())
  create(@Body() createUserDto: CreateUserDto): Promise<User> {
    return this.usersService.create(createUserDto);
  }
}

// users.service.ts
@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  async findAll(): Promise<User[]> {
    return this.usersRepository.find();
  }
}

Kluczowe Koncepcje NestJS

Dependency Injection - NestJS ma wbudowany DI container. Musisz rozumieć scope providers (DEFAULT, REQUEST, TRANSIENT) i hierarchię modułów.

Guards, Interceptors, Pipes - trzy warstwy przetwarzania requestu:

  • Guards - autoryzacja (przed controller)
  • Interceptors - transformacja request/response (przed i po)
  • Pipes - walidacja i transformacja danych wejściowych

Kolejność wykonania:

Middleware → Guards → Interceptors (before) → Pipes → Handler → Interceptors (after)

Exception Filters - globalna obsługa błędów z możliwością customizacji per-controller lub per-handler.

Szczegółowe pytania z NestJS z odpowiedziami: NestJS - Pytania Rekrutacyjne i Przewodnik →

Bazy Danych - MongoDB i SQL

Na rozmowach backend pytania o bazy danych są nieuniknione. W ekosystemie Node.js najczęściej spotkasz MongoDB (z Mongoose) i PostgreSQL (z Prisma, TypeORM lub Knex).

MongoDB - Dokumentowa Baza Danych

MongoDB to naturalny wybór dla Node.js ze względu na format JSON. Musisz znać:

CRUD Operations:

// Mongoose example
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, unique: true, required: true },
  orders: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Order' }]
});

// Create
const user = await User.create({ name: 'Jan', email: 'jan@example.com' });

// Read with population
const userWithOrders = await User.findById(id).populate('orders');

// Update
await User.updateOne({ _id: id }, { $set: { name: 'Jan Nowak' } });

// Delete
await User.deleteOne({ _id: id });

Aggregation Pipeline - to częsty temat na rozmowach:

// Przykład: średnia wartość zamówień per użytkownik
const result = await Order.aggregate([
  { $match: { status: 'completed' } },
  { $group: {
    _id: '$userId',
    avgOrderValue: { $avg: '$total' },
    orderCount: { $sum: 1 }
  }},
  { $sort: { avgOrderValue: -1 } },
  { $limit: 10 }
]);

Indeksy - kiedy tworzyć, jakie typy (single field, compound, text, geospatial), jak analizować z explain().

Embedding vs Referencing:

// Embedding - dane w jednym dokumencie (dobre dla 1:few)
{
  name: 'Jan',
  address: { city: 'Warszawa', street: 'Marszałkowska' }
}

// Referencing - osobne dokumenty z referencją (dobre dla 1:many, many:many)
{
  name: 'Jan',
  orders: [ObjectId('...'), ObjectId('...')]
}

Szczegółowe pytania z MongoDB z odpowiedziami: MongoDB - Pytania Rekrutacyjne i Przewodnik →

SQL - PostgreSQL/MySQL

Nawet w ekosystemie Node.js, SQL jest wszędzie. Szczególnie w projektach wymagających transakcji ACID:

Podstawowe zapytania:

-- JOIN - najczęstsze pytanie
SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC;

-- Subquery
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE total > 1000);

-- Window functions (dla senior)
SELECT
  name,
  total,
  ROW_NUMBER() OVER (ORDER BY total DESC) as rank,
  SUM(total) OVER (ORDER BY created_at) as running_total
FROM orders;

Indeksy w SQL:

-- B-tree index (default)
CREATE INDEX idx_users_email ON users(email);

-- Composite index
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);

-- Partial index (PostgreSQL)
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;

Transakcje:

// Prisma transaction
await prisma.$transaction(async (tx) => {
  const user = await tx.user.update({
    where: { id: userId },
    data: { balance: { decrement: amount } }
  });

  await tx.order.create({
    data: { userId, amount, status: 'completed' }
  });
});

N+1 Problem - klasyczne pytanie:

// Problem N+1 - 1 query na users + N queries na orders
const users = await User.findAll();
for (const user of users) {
  const orders = await Order.findAll({ where: { userId: user.id } });
}

// Rozwiązanie - eager loading
const users = await User.findAll({
  include: [{ model: Order }]
});

Szczegółowe pytania z SQL z odpowiedziami: SQL - Pytania Rekrutacyjne →

REST API Design

Projektowanie API to kluczowa umiejętność backend developera. Rekruterzy sprawdzają nie tylko czy potrafisz napisać endpoint, ale czy rozumiesz dobre praktyki.

Konwencje REST

GET    /api/users          # Lista users
GET    /api/users/123      # Pojedynczy user
POST   /api/users          # Tworzenie user
PUT    /api/users/123      # Pełna aktualizacja
PATCH  /api/users/123      # Częściowa aktualizacja
DELETE /api/users/123      # Usunięcie

# Zasoby zagnieżdżone
GET    /api/users/123/orders
POST   /api/users/123/orders

# Filtrowanie, sortowanie, paginacja
GET    /api/users?status=active&sort=-createdAt&page=2&limit=20

HTTP Status Codes

Musisz znać najważniejsze i kiedy ich używać:

Code Kiedy używać
200 OK Sukces GET, PUT, PATCH
201 Created Sukces POST (zasób utworzony)
204 No Content Sukces DELETE
400 Bad Request Błędne dane wejściowe
401 Unauthorized Brak/nieprawidłowy token
403 Forbidden Brak uprawnień do zasobu
404 Not Found Zasób nie istnieje
409 Conflict Konflikt (np. duplikat email)
422 Unprocessable Entity Walidacja nie przeszła
500 Internal Server Error Błąd serwera

Wersjonowanie API

# W URL (najpopularniejsze)
/api/v1/users
/api/v2/users

# W header
Accept: application/vnd.myapp.v1+json

# Query param
/api/users?version=1

Obsługa Błędów

// Standardowy format błędu
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid input data",
    "details": [
      { "field": "email", "message": "Invalid email format" },
      { "field": "password", "message": "Must be at least 8 characters" }
    ]
  }
}

Architektura i Wzorce

Na stanowiskach mid i senior spodziewaj się pytań o architekturę. To odróżnia programistów, którzy "piszą kod" od tych, którzy "budują systemy".

Layered Architecture

┌─────────────────────────┐
│     Controllers         │  ← HTTP request/response
├─────────────────────────┤
│     Services            │  ← Business logic
├─────────────────────────┤
│     Repositories        │  ← Data access
├─────────────────────────┤
│     Database            │
└─────────────────────────┘
// Controller - tylko HTTP
@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}

  @Post()
  async create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto);
  }
}

// Service - business logic
@Injectable()
export class UsersService {
  constructor(private usersRepository: UsersRepository) {}

  async create(dto: CreateUserDto) {
    // Validation, business rules
    const existingUser = await this.usersRepository.findByEmail(dto.email);
    if (existingUser) {
      throw new ConflictException('Email already exists');
    }
    return this.usersRepository.create(dto);
  }
}

// Repository - data access
@Injectable()
export class UsersRepository {
  constructor(@InjectRepository(User) private repo: Repository<User>) {}

  async findByEmail(email: string) {
    return this.repo.findOne({ where: { email } });
  }
}

Microservices vs Monolit

Aspekt Monolit Microservices
Złożoność Niska Wysoka
Deployment Prosty Skomplikowany
Skalowanie Pionowe Poziome (per service)
Zespół Mały (do ~10 osób) Duży (wiele zespołów)
Kiedy MVP, mały projekt Duża skala, niezależne domeny

Komunikacja między microservices:

  • Synchroniczna: REST, gRPC
  • Asynchroniczna: Message queues (RabbitMQ, Kafka, Redis Pub/Sub)
// RabbitMQ example
// Publisher
channel.sendToQueue('orders', Buffer.from(JSON.stringify(order)));

// Consumer
channel.consume('orders', (msg) => {
  const order = JSON.parse(msg.content.toString());
  processOrder(order);
  channel.ack(msg);
});

CQRS i Event Sourcing

CQRS (Command Query Responsibility Segregation) - oddzielne modele do odczytu i zapisu:

// Command (zapis)
class CreateOrderCommand {
  constructor(
    public readonly userId: string,
    public readonly items: OrderItem[]
  ) {}
}

// Query (odczyt)
class GetOrdersQuery {
  constructor(
    public readonly userId: string,
    public readonly status?: string
  ) {}
}

Szczegółowe pytania o architekturę z odpowiedziami: Wzorce i Architektura Backend →

Bezpieczeństwo i Uwierzytelnianie

Bezpieczeństwo to krytyczny temat dla backendu. Rekruterzy sprawdzają czy rozumiesz zagrożenia i jak się przed nimi chronić.

JWT Authentication

const jwt = require('jsonwebtoken');

// Generowanie tokena
const token = jwt.sign(
  { userId: user.id, role: user.role },
  process.env.JWT_SECRET,
  { expiresIn: '1h' }
);

// Weryfikacja tokena (middleware)
const authMiddleware = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];

  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }

  try {
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded;
    next();
  } catch (err) {
    return res.status(401).json({ error: 'Invalid token' });
  }
};

Access Token vs Refresh Token:

  • Access token: krótki czas życia (15min - 1h), używany do autoryzacji
  • Refresh token: długi czas życia (dni/tygodnie), używany do odświeżania access token

OWASP Top 10 - Co Musisz Znać

  1. Injection (SQL, NoSQL):
// ŹLE - SQL Injection
const query = `SELECT * FROM users WHERE email = '${email}'`;

// DOBRZE - Parametrized query
const query = 'SELECT * FROM users WHERE email = $1';
await db.query(query, [email]);
  1. Broken Authentication - słabe hasła, brak rate limiting, sesje nie wygasają
  2. Sensitive Data Exposure - niezaszyfrowane hasła, tokeny w URL
  3. XSS (Cross-Site Scripting):
// DOBRZE - sanityzacja danych wejściowych
const sanitizeHtml = require('sanitize-html');
const clean = sanitizeHtml(userInput);
  1. CSRF - używaj tokenów CSRF dla formularzy

Hashowanie Haseł

const bcrypt = require('bcrypt');

// Hashowanie hasła przy rejestracji
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(password, salt);

// Weryfikacja przy logowaniu
const isMatch = await bcrypt.compare(password, user.hashedPassword);

Dlaczego bcrypt a nie SHA-256? bcrypt jest celowo wolny (brute-force resistant) i ma wbudowaną sól.

Testowanie

Testowanie to część pracy backend developera. Na rozmowach pytania o testy padają regularnie.

Unit Tests

// users.service.spec.ts
describe('UsersService', () => {
  let service: UsersService;
  let repository: MockRepository<User>;

  beforeEach(() => {
    repository = createMockRepository();
    service = new UsersService(repository);
  });

  describe('create', () => {
    it('should create a new user', async () => {
      const dto = { email: 'test@example.com', name: 'Test' };
      repository.findOne.mockResolvedValue(null);
      repository.create.mockResolvedValue({ id: 1, ...dto });

      const result = await service.create(dto);

      expect(result.email).toBe(dto.email);
      expect(repository.create).toHaveBeenCalledWith(dto);
    });

    it('should throw if email exists', async () => {
      const dto = { email: 'existing@example.com', name: 'Test' };
      repository.findOne.mockResolvedValue({ id: 1, ...dto });

      await expect(service.create(dto)).rejects.toThrow(ConflictException);
    });
  });
});

Integration Tests

// users.e2e-spec.ts
describe('Users API (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/users (POST)', () => {
    return request(app.getHttpServer())
      .post('/users')
      .send({ email: 'test@example.com', name: 'Test' })
      .expect(201)
      .expect((res) => {
        expect(res.body.email).toBe('test@example.com');
      });
  });

  afterAll(async () => {
    await app.close();
  });
});

Test Pyramid

       /\
      /  \  E2E Tests (few)
     /----\
    /      \  Integration Tests (some)
   /--------\
  /          \  Unit Tests (many)
 /____________\

Plan Przygotowań: 3 Tygodnie do Rozmowy

Oto sprawdzony harmonogram przygotowań. Zakłada 1.5-2 godziny dziennie.

Tydzień 1: Node.js Core i Podstawy

Dni 1-3: Node.js Core

  • Event loop - fazy, microtasks vs macrotasks
  • process.nextTick vs setImmediate
  • Streams - typy, backpressure, pipe
  • Praktyka: napisz CLI tool używając streams

Dni 4-5: Cluster i Worker Threads

  • Kiedy cluster, kiedy worker threads
  • Jak działa load balancing w cluster
  • Praktyka: zaimplementuj serwer HTTP z cluster

Dni 6-7: Moduły i Error Handling

  • CommonJS vs ES Modules
  • Error handling patterns
  • Uncaught exceptions i unhandled rejections

Tydzień 2: Framework i Bazy Danych

Dni 1-3: Express.js lub NestJS

  • Middleware pipeline
  • Routing i struktura
  • Error handling
  • Praktyka: zbuduj REST API od zera

Dni 4-5: MongoDB

  • CRUD operations
  • Aggregation pipeline
  • Indeksy i optymalizacja
  • Mongoose - schemas, middleware, population

Dni 6-7: SQL

  • JOINs i subqueries
  • Indeksy i optymalizacja
  • Transakcje
  • N+1 problem i eager loading

Tydzień 3: Architektura, Bezpieczeństwo i Mock Interviews

Dni 1-2: REST API Design

  • Konwencje i best practices
  • Wersjonowanie
  • Error handling

Dni 3-4: Architektura

  • Layered architecture
  • Microservices vs Monolit
  • Message queues
  • CQRS basics

Dni 5-7: Mock Interviews

  • Odpowiadaj na pytania na głos
  • Rozwiązuj zadania praktyczne z timerem
  • Przygotuj pytania dla rekrutera

Najczęstsze Błędy Kandydatów

Błąd 1: Znajomość Frameworka bez Node.js Core

"Znam Express" ale nie potrafi wyjaśnić jak działa event loop. Framework to abstrakcja nad Node.js - bez znajomości runtime'u, nie zrozumiesz dlaczego rzeczy działają.

Błąd 2: Ignorowanie SQL

Kandydat zna tylko MongoDB i pada na pytaniach o JOINy. Nawet jeśli firma używa MongoDB, SQL jest w 90% ofert. Musisz go znać.

Błąd 3: Brak Wiedzy o Bezpieczeństwie

"Jak zabezpieczyć endpoint?" - cisza. Bezpieczeństwo to podstawa backendu. Musisz znać OWASP Top 10 i podstawowe zabezpieczenia.

Błąd 4: Nieznajomość Architektury

Senior który nie potrafi wyjaśnić różnicy między monolitem a microservices. Na wyższych stanowiskach architektura jest kluczowa.

Błąd 5: Brak Praktycznego Doświadczenia

Teoria bez praktyki. Rekruterzy szybko wyczują, czy naprawdę budowałeś systemy, czy tylko czytałeś dokumentację.

Podsumowanie: Checklist Przed Rozmową

Node.js Core:

  • Rozumiesz event loop i jego fazy
  • Znasz różnicę nextTick vs setImmediate
  • Wiesz jak działają streams
  • Rozumiesz cluster i worker threads

Framework:

  • Znasz middleware pipeline
  • Potrafisz zbudować REST API od zera
  • Rozumiesz error handling
  • Znasz najnowsze features frameworka

Bazy danych:

  • MongoDB: CRUD, aggregation, indeksy
  • SQL: JOINs, subqueries, transakcje
  • Rozumiesz N+1 problem i jak go rozwiązać

Architektura:

  • Znasz layered architecture
  • Rozumiesz microservices vs monolit
  • Wiesz co to CQRS
  • Potrafisz zaprojektować REST API

Bezpieczeństwo:

  • JWT authentication
  • OWASP Top 10 basics
  • Hashowanie haseł (bcrypt)

Testowanie:

  • Unit tests
  • Integration tests
  • Mocking

Zobacz też


Chcesz Więcej Pytań na Rozmowę Node.js Backend?

Ten artykuł to mapa - pokazuje, co musisz wiedzieć. Ale prawdziwe przygotowanie wymaga praktyki z konkretnymi pytaniami.

Mamy zestawy pytań dla każdej technologii backend - Node.js (100 pytań), Express.js (42 pytania), NestJS (42 pytania), MongoDB (44 pytania), SQL (50 pytań) i więcej. Każde pytanie z odpowiedzią w formacie "30 sekund / 2 minuty" - dokładnie tak, jak wyglądają prawdziwe rozmowy.

Zdobądź Pełny Dostęp do Wszystkich Pytań →


Napisane przez zespół Flipcards, na podstawie doświadczeń z rozmów rekrutacyjnych w firmach technologicznych i software house'ach w Polsce i za granicą.

Chcesz więcej pytań rekrutacyjnych?

To tylko jeden temat z naszego kompletnego przewodnika po rozmowach rekrutacyjnych. Uzyskaj dostęp do 800+ pytań z 13 technologii.

Kup pełny dostęp Zobacz bezpłatny podgląd
Powrót do blogu

Zostaw komentarz

Pamiętaj, że komentarze muszą zostać zatwierdzone przed ich opublikowaniem.