Javascript 如何使用nestjs获取websocket url以及如何在postman中进行测试?
我正在使用nestjs创建平均堆栈应用程序。在nestjs中我正在使用WebSocket。我不知道如何在postman中测试WebSocket。通常,我在postman中有测试路由url,并得到类似“{routeUrl}”的o/p,但如何使用套接字给出我感到困惑 例如:Javascript 如何使用nestjs获取websocket url以及如何在postman中进行测试?,javascript,node.js,typescript,express,nestjs,Javascript,Node.js,Typescript,Express,Nestjs,我正在使用nestjs创建平均堆栈应用程序。在nestjs中我正在使用WebSocket。我不知道如何在postman中测试WebSocket。通常,我在postman中有测试路由url,并得到类似“{routeUrl}”的o/p,但如何使用套接字给出我感到困惑 例如: @WebSocketGateway() export class MessagesGateway implements OnGatewayDisconnect { constructor(@InjectModel(M
@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); } }
@WebSocketGateway()
导出类MessagesGateway实现OnGatewayDisconnect{
构造函数(@InjectModel(Message)专用只读messagesModel:
型号,
@InjectModel(房间)专用只读房间Model:ModelType,
@InjectModel(用户)专用只读用户Model:ModelType){/}
异步handleDisconnect(客户端:套接字){//
const user=wait this.usersModel.findOne({clientId:client.id});
如果(用户){
emit('users-changed',{user:user.昵称,事件:'left'});
user.clientId=null;
等待这个.usersModel.findByIdAndUpdate(user.\u id,user);
} }
@SubscribeMessage('enter-chat-room')//异步
enterChatRoom(客户端:套接字,数据:{昵称:字符串,roomId:字符串
}) {
让user=wait this.usersModel.findOne({昵称:data.昵称});
如果(!用户){
user=wait this.usersModel.create({昵称:data.昵称,clientId:client.id});
}否则{
user.clientId=client.id;
user=wait this.usersModel.findByIdAndUpdate(user.\u id,user,{new:true});
}
client.join(data.roomId).broadcast.to(data.roomId)
.emit('users-changed',{user:user.昵称,事件:'joined'});//}
@SubscribeMessage('leave-chat-room')//异步
leaveChatRoom(客户端:套接字,数据:{昵称:string,roomId:string
}) {
const user=wait this.usersModel.findOne({昵称:data.昵称});
client.broadcast.to(data.roomId).emit('users-changed',{user:user.昵称,事件:'left'});//
client.leave(data.roomId);}
@SubscribeMessage('add-message')//异步addMessage(客户端:
套接字,消息:消息){
message.owner=wait this.usersModel.findOne({clientId:client.id});
message.created=新日期();
message=wait this.messagesModel.create(message);
client.server.in(message.room作为字符串).emit('message',message);}
在您的情况下,当您不指定WS的路径时,它正在与服务器侦听相同的端口上侦听,而路径根本不重要
WS是一种不同的协议,您必须在思想上转换到这种思维方式
您将无法使用Postman测试WS-server。然而,要做到这一点,您必须创建WS-client,我强烈建议您使用Nest创建E2E测试,以使用代码而不是手动测试它 以下是我的工作示例:
import*作为“ws”中的WebSocket
之前(异步()=>{
const moduleFixture=await Test.createTestingModule({
进口:[
SocketModule,
],
})
.compile()
app=moduleTexture.createNestApplication()
app.useWebSocketAdapter(新的WsAdapter(app))
等待app.init()
})
它('应成功连接',(完成)=>{
const address=app.getHttpServer().listen().address()
const baseAddress=`http://[${address.address}]:${address.port}`
常量套接字=新的WebSocket(基地址)
socket.on('open',()=>{
console.log('我已连接!Yeaap')
完成()
})
socket.on('关闭',(代码,原因)=>{
完成({code,reason})
})
socket.on('错误',(错误)=>{
完成(错误)
})
})
当我们在服务器上为e2e创建客户机时,将详细讨论此答案。您认为我们需要运行服务器WebSocket吗?因为在本地进行测试很好,但在circle CI、GitHub PR测试、测试覆盖率等方面会失败。它不会失败。我正在我们的CI端口上成功运行e2e测试,这可能是一个问题,但通过简单的函数查找可用端口可以轻松解决。@MarekUrbanowicz,您能看一下吗