Bird
Raised Fist0
NestJSframework~5 mins

WebSocket gateway creation in NestJS

Choose your learning style10 modes available
Introduction

A WebSocket gateway lets your app talk instantly with users without waiting for them to ask. It helps send and get messages in real time.

You want to build a chat app where messages appear instantly.
You need live updates on a dashboard without refreshing the page.
You want to notify users immediately when something changes.
You are making a multiplayer game that needs fast communication.
You want to stream data like stock prices or sports scores live.
Syntax
NestJS
import { WebSocketGateway, SubscribeMessage, MessageBody, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class MyGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('message')
  handleMessage(@MessageBody() data: string): string {
    return `Received: ${data}`;
  }
}

@WebSocketGateway() marks the class as a WebSocket gateway.

@SubscribeMessage('event') listens for messages with the given event name.

Examples
This listens for 'chat' messages and replies with a simple string.
NestJS
import { WebSocketGateway, SubscribeMessage, MessageBody } from '@nestjs/websockets';

@WebSocketGateway()
export class ChatGateway {
  @SubscribeMessage('chat')
  onChat(@MessageBody() message: string): string {
    return `Chat message: ${message}`;
  }
}
This gateway runs on port 3001 and can send messages to all connected clients.
NestJS
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway(3001)
export class EventsGateway {
  @WebSocketServer()
  server: Server;

  sendEvent() {
    this.server.emit('event', 'Hello everyone!');
  }
}
Sample Program

This gateway listens for a 'greet' message with a name and replies with a hello message including that name.

NestJS
import { WebSocketGateway, SubscribeMessage, MessageBody, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';

@WebSocketGateway()
export class SimpleGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('greet')
  handleGreet(@MessageBody() name: string): string {
    return `Hello, ${name}!`;
  }
}
OutputSuccess
Important Notes

Make sure to install @nestjs/websockets and socket.io packages.

Use @WebSocketServer() to access the server and send messages to clients.

Event names in @SubscribeMessage() must match what clients send.

Summary

WebSocket gateways let your NestJS app handle real-time messages easily.

Use decorators to listen for and respond to events.

You can send messages back to one or all connected clients.

Practice

(1/5)
1. What is the main purpose of a WebSocket gateway in a NestJS application?
easy
A. To serve static files like images and CSS
B. To handle real-time communication between server and clients
C. To manage database connections
D. To handle HTTP request routing

Solution

  1. Step 1: Understand WebSocket gateway role

    A WebSocket gateway is designed to manage real-time, two-way communication between the server and clients.
  2. Step 2: Compare with other server roles

    Managing database connections, serving static files, or HTTP routing are handled by other parts of NestJS, not WebSocket gateways.
  3. Final Answer:

    To handle real-time communication between server and clients -> Option B
  4. Quick Check:

    WebSocket gateway = real-time communication [OK]
Hint: WebSocket gateways are for live message exchange [OK]
Common Mistakes:
  • Confusing WebSocket gateway with HTTP routing
  • Thinking it manages database connections
  • Assuming it serves static files
2. Which decorator is used to define a WebSocket gateway class in NestJS?
easy
A. @Gateway()
B. @SocketGateway()
C. @WebSocketGateway()
D. @WebSocketServer()

Solution

  1. Step 1: Identify the correct decorator for gateway class

    The official NestJS decorator to create a WebSocket gateway class is @WebSocketGateway().
  2. Step 2: Differentiate from other decorators

    @WebSocketServer() is used inside the class to inject the server instance, not to define the class itself. The others are incorrect or do not exist.
  3. Final Answer:

    @WebSocketGateway() -> Option C
  4. Quick Check:

    Gateway class decorator = @WebSocketGateway() [OK]
Hint: Gateway class always uses @WebSocketGateway() [OK]
Common Mistakes:
  • Using @WebSocketServer() to decorate the class
  • Confusing with non-existent decorators
  • Omitting parentheses on the decorator
3. Given this NestJS WebSocket gateway code, what will be logged when a client sends a 'message' event with payload 'Hello'?
import { WebSocketGateway, SubscribeMessage, MessageBody } from '@nestjs/websockets';

@WebSocketGateway()
export class ChatGateway {
  @SubscribeMessage('message')
  handleMessage(@MessageBody() data: string): string {
    console.log('Received:', data);
    return `Echo: ${data}`;
  }
}
medium
A. Received: Hello
B. Echo: Hello
C. message event received
D. No output logged

Solution

  1. Step 1: Analyze the handleMessage method

    The method logs the string 'Received:' followed by the data payload, which is 'Hello'.
  2. Step 2: Understand what is returned vs logged

    The return value is 'Echo: Hello', but only the console.log outputs to the server console. The client receives the return value, but the question asks about what is logged.
  3. Final Answer:

    Received: Hello -> Option A
  4. Quick Check:

    Console logs 'Received: Hello' [OK]
Hint: Look for console.log to find logged output [OK]
Common Mistakes:
  • Confusing returned value with logged output
  • Assuming client message is logged
  • Ignoring the console.log statement
4. Identify the error in this WebSocket gateway code snippet:
import { WebSocketGateway, SubscribeMessage } from '@nestjs/websockets';

@WebSocketGateway()
export class MyGateway {
  @SubscribeMessage('chat')
  onChat(data: string) {
    return `Message: ${data}`;
  }
}
medium
A. Method onChat must be async
B. Incorrect event name in @SubscribeMessage decorator
C. WebSocketGateway decorator requires a port number
D. Missing @MessageBody() decorator on the method parameter

Solution

  1. Step 1: Check method parameter decorators

    In NestJS WebSocket gateways, to receive the message payload, the parameter must be decorated with @MessageBody().
  2. Step 2: Verify other parts

    The event name 'chat' is valid, @WebSocketGateway() can be used without a port, and the method does not need to be async unless awaiting something.
  3. Final Answer:

    Missing @MessageBody() decorator on the method parameter -> Option D
  4. Quick Check:

    Parameter needs @MessageBody() [OK]
Hint: Always decorate message parameters with @MessageBody() [OK]
Common Mistakes:
  • Omitting @MessageBody() on parameters
  • Thinking port number is mandatory
  • Assuming method must be async
5. How can you broadcast a message to all connected clients from within a NestJS WebSocket gateway?
hard
A. Use the injected server instance with this.server.emit('event', data)
B. Return the message string from the event handler method
C. Call client.send(data) on a single client only
D. Use @SubscribeMessage('broadcast') decorator on the method

Solution

  1. Step 1: Understand broadcasting in NestJS gateways

    To send a message to all clients, you use the server instance injected with @WebSocketServer() and call emit on it.
  2. Step 2: Differentiate from other options

    Returning a string sends a response only to the sender. Calling client.send() targets one client. The decorator @SubscribeMessage() only listens for events, it does not broadcast.
  3. Final Answer:

    Use the injected server instance with this.server.emit('event', data) -> Option A
  4. Quick Check:

    Broadcast = this.server.emit() [OK]
Hint: Broadcast with this.server.emit() inside gateway [OK]
Common Mistakes:
  • Returning message instead of emitting
  • Sending to one client only
  • Misusing decorators for broadcasting
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