javascript - איך לקבל כתובת URL של websocket באמצעות NestJS ואיך לבדוק את זה ב-Postman?
אני יוצר אפליקציית mean stack באמצעות nestjs. ב-nest js אני משתמש ב-websockets. אני לא יודע איך לבדוק websockets ב-postman. בדרך כלל יש לי כתובת נתיב לבדיקה ב-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)
})
})
פרט לגבי תשובה זו נדון כאן
