Bird
Raised Fist0
NestJSframework~10 mins

TCP transport in NestJS - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - TCP transport
Start NestJS App
↓
Create TCP Server
↓
Listen for TCP Connections
↓
Receive TCP Message
↓
Process Message in Handler
↓
Send Response Back
↓
Wait for Next Message or Connection
NestJS app starts and creates a TCP server that listens for messages, processes them, and sends responses.
Execution Sample
NestJS
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class AppController {
  @MessagePattern({ cmd: 'sum' })
  sum(data: number[]): number {
    return data.reduce((a, b) => a + b, 0);
  }
}
A NestJS controller listens for TCP messages with command 'sum' and returns the sum of numbers.
Execution Table
StepActionInput MessageHandler CalledHandler OutputResponse Sent
1TCP Server starts listeningN/AN/AN/AN/A
2Client sends message{ cmd: 'sum', data: [1,2,3] }sum66
3Client sends message{ cmd: 'sum', data: [10,20] }sum3030
4Client sends message{ cmd: 'sum', data: [] }sum00
5No more messagesN/AN/AN/AN/A
💡 No more messages received, TCP server continues listening.
Variable Tracker
VariableStartAfter 1After 2After 3Final
dataN/A[1,2,3][10,20][][]
handlerOutputN/A63000
Key Moments - 2 Insights
Why does the handler method 'sum' get called only when the message has cmd 'sum'?
Because the @MessagePattern decorator filters messages by the 'cmd' property, so only messages with cmd 'sum' trigger the sum method (see execution_table rows 2-4).
What happens if the client sends a message with a different command?
The TCP server ignores it or does not call the sum handler, so no response is sent for unknown commands (not shown in execution_table but implied).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the handler output at step 3?
A6
B0
C30
DN/A
💡 Hint
Check the 'Handler Output' column at step 3 in the execution_table.
At which step does the handler receive an empty array as input?
AStep 2
BStep 4
CStep 3
DStep 1
💡 Hint
Look at the 'Input Message' column in execution_table for an empty data array.
If the client sends a message with cmd 'multiply', what happens?
ANo handler is called
BAn error is thrown
Csum handler is called with data
DResponse is always 0
💡 Hint
Recall that @MessagePattern filters by cmd 'sum' only, so other commands do not trigger handlers.
Concept Snapshot
NestJS TCP Transport Quick Guide:
- Use @MessagePattern({ cmd: 'name' }) to listen for TCP messages.
- TCP server listens continuously for messages.
- Handler methods process messages matching their cmd.
- Responses are sent back over TCP automatically.
- Unknown commands do not trigger handlers.
Full Transcript
This visual execution trace shows how NestJS uses TCP transport. The app starts and creates a TCP server that listens for messages. When a client sends a message with a command 'sum' and data array, the sum handler method is called. It calculates the sum of the numbers and sends the result back. This repeats for each message. If the message command does not match, no handler is called. Variables like data and handlerOutput change with each message. This helps beginners see how TCP messages flow through NestJS microservices.

Practice

(1/5)
1. What is the main purpose of using Transport.TCP in a NestJS microservice?
easy
A. To connect to a database using TCP.
B. To serve static files over HTTP.
C. To enable communication between microservices using TCP sockets.
D. To handle WebSocket connections.

Solution

  1. Step 1: Understand the role of Transport.TCP

    Transport.TCP is used in NestJS to set up microservices communication over TCP sockets.
  2. Step 2: Compare with other options

    Serving static files, database connections, and WebSocket handling are different concerns not related to Transport.TCP.
  3. Final Answer:

    To enable communication between microservices using TCP sockets. -> Option C
  4. Quick Check:

    Transport.TCP = Microservice TCP communication [OK]
Hint: Remember TCP transport is for microservice socket communication [OK]
Common Mistakes:
  • Confusing TCP transport with HTTP or WebSocket protocols
  • Thinking it handles database connections
  • Assuming it serves static files
2. Which of the following is the correct way to create a TCP microservice in NestJS?
easy
A. const app = await NestFactory.createMicroservice(AppModule, { protocol: Transport.TCP, port: 3000 });
B. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { port: 3000 } });
C. const app = await NestFactory.createMicroservice(AppModule, { transport: 'tcp', port: 3000 });
D. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.HTTP, options: { port: 3000 } });

Solution

  1. Step 1: Check NestJS microservice creation syntax

    The correct syntax uses transport: Transport.TCP and an options object with port.
  2. Step 2: Identify incorrect options

    The other options use wrong properties like protocol instead of transport, pass port directly without an options object, use string 'tcp' instead of the Transport.TCP enum, or use the wrong transport type like Transport.HTTP.
  3. Final Answer:

    const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { port: 3000 } }); -> Option B
  4. Quick Check:

    Use transport: Transport.TCP with options object [OK]
Hint: Use Transport.TCP enum and options object for port [OK]
Common Mistakes:
  • Using 'protocol' instead of 'transport'
  • Passing port directly without options object
  • Using string 'tcp' instead of Transport.TCP enum
  • Confusing TCP with HTTP transport
3. Given this NestJS TCP microservice setup:
const app = await NestFactory.createMicroservice(AppModule, {
  transport: Transport.TCP,
  options: { host: '127.0.0.1', port: 4000 }
});
await app.listen();
console.log('Microservice is listening');

What will be the output when the microservice starts successfully?
medium
A. Microservice failed to start
B. Error: Port 4000 is already in use
C. Listening on HTTP port 4000
D. Microservice is listening

Solution

  1. Step 1: Understand the code flow

    The microservice is created with TCP transport on host 127.0.0.1 and port 4000, then listens successfully.
  2. Step 2: Identify the console output

    After await app.listen(), the console logs 'Microservice is listening'. No errors are shown.
  3. Final Answer:

    Microservice is listening -> Option D
  4. Quick Check:

    Successful listen logs message [OK]
Hint: Successful listen logs 'Microservice is listening' [OK]
Common Mistakes:
  • Assuming automatic HTTP server start
  • Expecting error without port conflict
  • Confusing TCP with HTTP output
4. Identify the error in this NestJS TCP microservice code:
const app = await NestFactory.createMicroservice(AppModule, {
  transport: Transport.TCP,
  options: { port: '3000' }
});
await app.listen();
medium
A. Port should be a number, not a string.
B. Missing host option causes failure.
C. Transport.TCP is invalid here.
D. app.listen() must be called with a callback.

Solution

  1. Step 1: Check the options object

    The port value is given as a string '3000', but it must be a number.
  2. Step 2: Validate other parts

    Host is optional, Transport.TCP is valid, and app.listen() can be awaited without callback.
  3. Final Answer:

    Port should be a number, not a string. -> Option A
  4. Quick Check:

    Port must be numeric type [OK]
Hint: Port option must be a number, not quoted string [OK]
Common Mistakes:
  • Passing port as string instead of number
  • Thinking host is mandatory
  • Expecting app.listen to require callback
5. You want to create a NestJS TCP microservice that listens on all network interfaces on port 5000 and logs a message when a client connects. Which code snippet correctly implements this?
hard
A. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { host: '0.0.0.0', port: 5000 } }); await app.listen(); app.on('connection', () => console.log('Client connected'));
B. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { host: '0.0.0.0', port: 5000 } }); app.listen(() => console.log('Client connected'));
C. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { host: 'localhost', port: 5000 } }); app.listen(() => console.log('Client connected'));
D. const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { port: 5000 } }); app.listen(() => console.log('Client connected'));

Solution

  1. Step 1: Set host and port correctly

    To listen on all interfaces, host must be '0.0.0.0' and port 5000 is correct.
  2. Step 2: Attach client connection event properly

    TCP microservice emits 'connection' event; attaching listener after await app.listen() is correct.
  3. Step 3: Evaluate distractors

    Distractors either use the wrong host like 'localhost', omit the host, fail to await app.listen(), or attach the logger to the listen() callback instead of the 'connection' event.
  4. Final Answer:

    const app = await NestFactory.createMicroservice(AppModule, { transport: Transport.TCP, options: { host: '0.0.0.0', port: 5000 } }); await app.listen(); app.on('connection', () => console.log('Client connected')); -> Option A
  5. Quick Check:

    Host 0.0.0.0 + event listener after listen [OK]
Hint: Use host '0.0.0.0' and listen before event binding [OK]
Common Mistakes:
  • Using 'localhost' instead of '0.0.0.0' to listen on all interfaces
  • Logging inside listen callback instead of connection event
  • Not awaiting app.listen() before event binding
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard