javascript - Làm thế nào để lấy URL websocket sử dụng nestjs và cách kiểm tra trong postman?
Tôi đang tạo ứng dụng mean stack sử dụng nestjs. Trong nestjs tôi đang sử dụng websockets. Tôi không biết cách kiểm tra websockets trong postman. Thông thường tôi có url route để test trong postman và nhận kết quả như: "http://localhost:3000/{routeUrl}" nhưng tôi bối rối không biết cách sử dụng sockets như thế nào.
ví dụ :
@WebSocketGateway()
export class MessagesGateway implements OnGatewayDisconnect {
constructor(@InjectModel(Message) private readonly messagesModel:
ModelType<Message>,
@InjectModel(Room) private readonly roomsModel: ModelType<Room>,
@InjectModel(User) private readonly usersModel: ModelType<User>) { // <1> }
async handleDisconnect(client: Socket) { // <2>
const user = await this.usersModel.findOne({clientId: client.id});
if (user) {
client.server.emit('users-changed', {user: user.nickname, event: 'left'});
user.clientId = null;
await this.usersModel.findByIdAndUpdate(user._id, user);
} }
@SubscribeMessage('enter-chat-room') // <3> async
enterChatRoom(client: Socket, data: { nickname: string, roomId: string
}) {
let user = await this.usersModel.findOne({nickname: data.nickname});
if (!user) {
user = await this.usersModel.create({nickname: data.nickname, clientId: client.id});
} else {
user.clientId = client.id;
user = await this.usersModel.findByIdAndUpdate(user._id, user, {new: true});
}
client.join(data.roomId).broadcast.to(data.roomId)
.emit('users-changed', {user: user.nickname, event: 'joined'}); // <3> }
@SubscribeMessage('leave-chat-room') // <4> async
leaveChatRoom(client: Socket, data: { nickname: string, roomId: string
}) {
const user = await this.usersModel.findOne({nickname: data.nickname});
client.broadcast.to(data.roomId).emit('users-changed', {user: user.nickname, event: 'left'}); // <3>
client.leave(data.roomId); }
@SubscribeMessage('add-message') // <5> async addMessage(client:
Socket, message: Message) {
message.owner = await this.usersModel.findOne({clientId: client.id});
message.created = new Date();
message = await this.messagesModel.create(message);
client.server.in(message.room as string).emit('message', message); } }
Câu trả lời #1
Trong trường hợp của bạn, khi bạn không chỉ định đường dẫn của WS, nó sẽ lắng nghe trên cùng một cổng với máy chủ đang lắng nghe và đường dẫn không quan trọng chút nào.
WS là một giao thức khác và bạn phải chuyển đổi tư duy sang cách suy nghĩ này.
Bạn sẽ không thể kiểm tra máy chủ WS bằng Postman. Để làm điều đó, bạn phải tạo khách hàng WS của riêng mình, tuy nhiên, tôi khuyến khích bạn mạnh mẽ tạo các bài kiểm tra E2E với Nest để kiểm tra nó bằng mã, không phải thủ công.
Câu trả lời #2
Đây là ví dụ làm việc của tôi:
import * as WebSocket from 'ws'
beforeAll(async () => {
const moduleFixture = await Test.createTestingModule({
imports: [
SocketModule,
],
})
.compile()
app = moduleFixture.createNestApplication()
app.useWebSocketAdapter(new WsAdapter(app))
await app.init()
})
it('should connect successfully', (done) => {
const address = app.getHttpServer().listen().address()
const baseAddress = `http://[${address.address}]:${address.port}`
const socket = new WebSocket(baseAddress)
socket.on('open', () => {
console.log('I am connected! YEAAAP')
done()
})
socket.on('close', (code, reason) => {
done({ code, reason })
})
socket.on ('error', (error) => {
done(error)
})
})
Chi tiết về câu trả lời này được thảo luận ở đây
