javascript - วิธีดึง URL ของ websocket โดยใช้ nestjs และวิธีทดสอบใน postman?
ฉันกำลังสร้างแอปพลิเคชัน mean stack โดยใช้ nestjs ใน nestjs ฉันกำลังใช้ websockets ฉันไม่รู้ว่าจะทดสอบ websockets ใน postman อย่างไร โดยปกติฉันจะทดสอบ URL เส้นทางใน postman และได้รับผลลัพธ์เช่น: "http://localhost:3000/{routeUrl}" แต่การให้โดยใช้ sockets ฉันสับสน
ตัวอย่าง :
@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); } }
คำตอบ #1
ในกรณีของคุณ เมื่อคุณไม่ได้ระบุเส้นทางของ WS มันจะฟังที่พอร์ตเดียวกับเซิร์ฟเวอร์ที่กำลังฟังอยู่และเส้นทางไม่สำคัญเลย
WS เป็นโปรโตคอลที่แตกต่างไปและคุณต้องเปลี่ยนวิธีคิดของคุณมาที่แนวทางนี้
คุณจะไม่สามารถทดสอบเซิร์ฟเวอร์ WS ด้วย Postman ได้ ในการทำเช่นนั้นคุณต้องสร้างไคลเอนต์ WS ของคุณเอง อย่างไรก็ตาม ฉันขอแนะนำอย่างยิ่งให้คุณสร้างการทดสอบ E2E ด้วย Nest เพื่อตรวจสอบมันด้วยโค้ด ไม่ใช่ด้วยตนเอง
คำตอบ #2
นี่คือตัวอย่างการทำงานของฉัน:
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)
})
})
รายละเอียดเกี่ยวกับคำตอบนี้ถูกอภิปรายที่นี่
