javascript - Hvordan får man websocket-URL ved brug af nestjs, og hvordan tester man det i Postman?
Jeg er ved at skabe en mean stack applikation ved hjælp af nestjs. I nest js bruger jeg websockets. Jeg ved ikke, hvordan man tester websockets i Postman. Normalt har jeg en test-URL i Postman og får output som: "http://localhost:3000/{routeUrl}" men hvordan man bruger sockets, er jeg forvirret over.
eksempel :
@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); } }
Svar #1
I dit tilfælde, når du ikke angiver stien til WS, lytter den på samme port som serveren lytter på, og stien betyder overhovedet ikke noget.
WS er et andet protokol, og du er nødt til at foretage det mentale skift til denne måde at tænke på.
Du vil ikke være i stand til at teste WS-serveren med Postman. For at gøre det skal du oprette din WS-klient, men jeg opfordrer dig kraftigt til at oprette E2E-tests med Nest for at teste det med koden, ikke manuelt.
Svar #2
Her er mit fungerende eksempel:
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)
})
})
Detaljer om dette svar diskuteres her
