简体   繁体   English

NestJS,SuperTest - 套接字没有得到事件

[英]NestJS, SuperTest - Socket doesn't get event

I am struggling with my e2e test about my socket.我正在努力进行有关我的套接字的 e2e 测试。

The socket connects and logs well to the NestJS Gateway, but it doesn't come into my listener bedRequest .套接字连接并很好地记录到 NestJS 网关,但它没有进入我的监听器bedRequest

My test consists of sending a create request through supertest and at the end, the gateway broadcasts a message to connected sockets and I want to verify it.我的测试包括通过 supertest 发送创建请求,最后,网关向连接的套接字广播一条消息,我想对其进行验证。

In Gateway logs, I see the client connected, logIn, and disconnected if it can help.在网关日志中,如果有帮助,我会看到客户端已连接、登录和断开连接。

Thank you in advance.先感谢您。

 it("/POST bedRequest", (done) => {
        let bedRequestCreate = some payload
        let expectedResult = other payload

        const address = app.getHttpServer().listen().address();
        const baseAddress = `http://[${address.address}]:${address.port}`;
        const client = io(`${baseAddress}/`);

        client.on("connect", () => { // this works
            client.emit("logIn", {access_token: accessToken}, (isConnected) => {
                expect(isConnected).toBeTruthy(); // this works

                client.on("bedRequest", (data) => { // this doesn't work
                    expect(JSON.parse(data)).toMatchObject({
                        siteId: bedRequestCreate.siteId,
                        ...expectedResult
                    });
                    done();
                });
            });
        });

        return request(app.getHttpServer())
            .post("/api/bedRequest/")
            .send(bedRequestCreate)
            .set('Accept', 'application/json')
            .set('Authorization', 'Bearer ' + accessToken)
            .expect('Content-Type', /json/)
            .expect(201)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body.generatedMaps[0]).toMatchObject(expectedResult); // this works
            });
    });

Gateway :网关 :

@WebSocketGateway()
export class SocketGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {

    @WebSocketServer() server: Server;

    wsClients = [];

    private logger: Logger = new Logger('SocketGateway');

    handleDisconnect(client: Client) {
        for (let i = 0; i < this.wsClients.length; i++) {
            if (this.wsClients[i] === client) {
                this.wsClients.splice(i, 1);
                break;
            }
        }
        this.logger.log(`Client disconnected: ${client.id}`);
    }

    broadcast(event: String, message: any) {
        const broadCastMessage = JSON.stringify(message);
        for (let c of this.wsClients) { // sends to the right client
            c.send(event, broadCastMessage);
        }
    }

    @UseGuards(WebSocketJwtAuthGuard)
    @SubscribeMessage("logIn")
    handleLogIn(client) { // works
        this.logger.log(`Socket Client connected : ${client.id} for user ${client.user.id} / ${client.mail}`);
        this.wsClients.push(client);
        return true;
    }

    handleConnection(client) {
        return `Client connected: ${client.id}`;
    }

    afterInit() {
        this.logger.log("SocketGateway initialized")
    }

}

Okay I found it...好吧我找到了...

It was because of this line : c.send(event, broadCastMessage);这是因为这一行: c.send(event, broadCastMessage);

I changed send by emit and it works fine.我改变了通过emit send ,它工作正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM