网关配置
在 NestJS 中配置 WebSocket 网关,处理连接事件、消息和房间管理。
网关配置 是 CoddyKit 上的免费 Node.js Backend Development Bootcamp 课时。 这是第 4 节课,共 6 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Node.js Backend Development Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Node.js Backend Development Bootcamp 课程共包含 6 节课。
本课时的部分内容尚未翻译,以英文显示。
Unlocking Real-time with Gateways
Welcome back! In the previous lesson, we learned about WebSockets. Now, let's dive into how NestJS makes real-time communication easy with Gateways.
Think of a Gateway as a special controller for WebSocket connections. It listens for messages from clients and sends responses back, enabling dynamic, two-way communication.
Creating Your First Gateway
To create a Gateway, we use the @WebSocketGateway() decorator. This decorator marks a class as a WebSocket gateway.
By default, NestJS uses Socket.IO. You can specify a port, namespace, or other options. Let's start with a basic gateway:
import { WebSocketGateway,
WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001) // Listens on port 3001 for WS
export class EventsGateway {
@WebSocketServer() server: Server;
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000); // HTTP app, WS runs alongside
}
bootstrap();Gateway Configuration Options
The @WebSocketGateway() decorator accepts an optional configuration object. This lets you customize how your WebSocket server behaves:
port: The port the WebSocket server listens on (e.g.,3001).namespace: Group connections under a specific path (e.g.,'/chat').cors: Configure Cross-Origin Resource Sharing for browser clients.adapter: Specify a custom WebSocket adapter (e.g., for `ws` instead of `socket.io`).
Handling Connections & Disconnections
Gateways can react to client connections and disconnections using lifecycle hooks. These are interfaces your gateway can implement:
OnGatewayInit: Called once the gateway is initialized.OnGatewayConnection: Called when a client connects.OnGatewayDisconnect: Called when a client disconnects.
Use these to perform setup or cleanup tasks.
import { WebSocketGateway,
OnGatewayConnection,
OnGatewayDisconnect,
WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001)
export class EventsGateway
implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
handleConnection(client: Socket, ...args: any[]) {
console.log(`Client connected: ${client.id}`);
}
handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();Subscribing to Client Messages
Clients send messages with an 'event name'. Your gateway listens for these specific events using the @SubscribeMessage() decorator.
The decorated method receives the client (Socket instance) and the payload (data sent by the client).
import { WebSocketGateway,
SubscribeMessage,
WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001)
export class EventsGateway {
@WebSocketServer() server: Server;
@SubscribeMessage('sendMessage')
handleMessage(client: Socket, payload: string): void {
console.log(`Message from ${client.id}: ${payload}`);
// Process payload, then send response
}
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();Sending Messages Back to Clients
Once your gateway receives a message, you'll often want to send a response. You can inject the WebSocketServer instance using @WebSocketServer().
To send a message to a specific client, use client.emit('eventName', data). To broadcast to all clients, use this.server.emit('eventName', data).
import { WebSocketGateway,
SubscribeMessage,
WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001)
export class EventsGateway {
@WebSocketServer() server: Server;
@SubscribeMessage('echo')
handleEcho(client: Socket, payload: string): void {
console.log(`Received: ${payload} from ${client.id}`);
client.emit('echoResponse', `You said: ${payload}`);
}
@SubscribeMessage('broadcast')
handleBroadcast(client: Socket, payload: string): void {
this.server.emit(
'broadcastMessage',
`${client.id} broadcasted: ${payload}`
);
}
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();Organizing Clients with Rooms
For more complex applications, you might not want to broadcast every message to every client. This is where rooms come in handy!
Rooms allow you to group specific clients together. Messages can then be sent only to clients within a particular room. This is perfect for chat channels, game lobbies, or specific user notifications.
Joining and Leaving Rooms
Socket.IO clients can join or leave rooms dynamically. You can manage this from your gateway methods using the client instance:
client.join(roomName): Adds the client to the specified room.client.leave(roomName): Removes the client from the specified room.
A client can be in multiple rooms simultaneously.
import { WebSocketGateway,
SubscribeMessage,
WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001)
export class EventsGateway {
@WebSocketServer() server: Server;
@SubscribeMessage('joinRoom')
handleJoinRoom(client: Socket, room: string): void {
client.join(room);
client.emit('joinedRoom', `You joined ${room}`);
console.log(`${client.id} joined room: ${room}`);
}
@SubscribeMessage('leaveRoom')
handleLeaveRoom(client: Socket, room: string): void {
client.leave(room);
client.emit('leftRoom', `You left ${room}`);
console.log(`${client.id} left room: ${room}`);
}
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();Sending Messages to Specific Rooms
Once clients are in rooms, you can send targeted messages. Use the server.to(roomName).emit('eventName', data) method.
This ensures only clients subscribed to that particular room receive the message, making your real-time updates efficient and relevant.
import { WebSocketGateway,
SubscribeMessage,
WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
// src/events.gateway.ts
@WebSocketGateway(3001)
export class EventsGateway {
@WebSocketServer() server: Server;
@SubscribeMessage('roomMessage')
handleRoomMessage(
client: Socket,
payload: { room: string; message: string },
): void {
const { room, message } = payload;
this.server
.to(room)
.emit('roomUpdate',
`[${room}] ${client.id}: ${message}`);
console.log(
`Message in ${room} from ${client.id}: ${message}`
);
}
}
// src/app.module.ts (minimal)
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway],
})
export class AppModule {}
// src/main.ts (minimal)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();Gateway Configuration Quiz
Which of the following statements about NestJS WebSocket Gateways and rooms are TRUE?
Recap: Master Your Gateway
Great job! You've learned how to configure NestJS Gateways for powerful real-time communication.
- We defined gateways using
@WebSocketGateway(). - We explored configuration options like port and namespace.
- We implemented lifecycle hooks for connections and disconnections.
- We handled client messages with
@SubscribeMessage(). - We used
@WebSocketServer()to broadcast and send targeted messages. - Finally, we mastered rooms for efficient client grouping and targeted messaging.
Next, we'll build a full real-time chat application!
常见问题解答
「网关配置」课时是免费的吗?
是的 — 「网关配置」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Node.js Backend Development Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 Node.js Backend Development Bootcamp 课程共包含 6 节课。
「网关配置」这节课中我会学到什么?
在 NestJS 中配置 WebSocket 网关,处理连接事件、消息和房间管理。 你通过在浏览器中直接运行的动手代码来练习 Node.js Backend Development Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Node.js Backend Development Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Node.js Backend Development Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 6 节。
「网关配置」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Node.js Backend Development Bootcamp 课中编写并运行代码吗?
能。每节 Node.js Backend Development Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。