如何将socket.io与graphql订阅一起使用?

如何将socket.io与graphql订阅一起使用?,socket.io,graphql,nestjs,publish-subscribe,subscription,Socket.io,Graphql,Nestjs,Publish Subscribe,Subscription,我想使用nestjs和graphql技术制作一个实时聊天应用程序。大部分教程都使用PubSub,但我不知道如何向特定的客户端发送消息(?)。 我认为使用socket.io通过使用socket id向特定客户机发送消息要容易得多 使用PubSub的示例如下: 有没有一种方法可以通过使用PubSub向特定客户机发送消息?通过接收一些关于发送者的数据,比如id 如何用Socket.io替换PubSub?我对Socket.io非常满意 App.module.ts import { Module, Mid

我想使用nestjs和graphql技术制作一个实时聊天应用程序。大部分教程都使用PubSub,但我不知道如何向特定的客户端发送消息(?)。 我认为使用socket.io通过使用socket id向特定客户机发送消息要容易得多

使用PubSub的示例如下:

  • 有没有一种方法可以通过使用PubSub向特定客户机发送消息?通过接收一些关于发送者的数据,比如id
  • 如何用Socket.io替换PubSub?我对Socket.io非常满意
  • App.module.ts

    import { Module, MiddlewareConsumer, RequestMethod, Get } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { typeOrmConfig } from './config/typeorm.config';
    import { AuthModule } from './auth/auth.module';
    import { LoggerMiddleware } from './common/middlewares/logger.middleware';
    import { Connection } from 'typeorm';
    import { GraphQLModule } from '@nestjs/graphql';
    import { join } from 'path';
    import { ChatModule } from './chat/chat.module';
    import { ChatService } from './chat/chat.service';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot(typeOrmConfig), // connect to database
        GraphQLModule.forRoot({
          debug: true,
          playground: true,
          typePaths: ['**/*.graphql'],
          definitions: {
            path: join(process.cwd(), 'src/graphql.ts'),
          },
        }),
        AuthModule,
        ChatModule,
      ],
      controllers: [],
      providers: [
      ],
    })
    export class AppModule {
    }
    
    import { Module } from '@nestjs/common';
    import { ChatService } from './chat.service';
    import { ChatResolver } from './chat.resolver';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { AuthModule } from '../auth/auth.module';
    import { PubSub } from 'graphql-subscriptions';
    
    @Module({
      imports: [
        // Add all repository here; productRepository, ...
        TypeOrmModule.forFeature( [
          // repositories ...
        ]),
        AuthModule
      ],
      providers: [
         //=> How to replace with socket.io ?
         {
           provide: 'PUB_SUB',
           useValue: new PubSub(),
        },
        ChatService, 
        ChatResolver,
      ]
    })
    export class ChatModule {}
    
    Chat.module.ts

    import { Module, MiddlewareConsumer, RequestMethod, Get } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { typeOrmConfig } from './config/typeorm.config';
    import { AuthModule } from './auth/auth.module';
    import { LoggerMiddleware } from './common/middlewares/logger.middleware';
    import { Connection } from 'typeorm';
    import { GraphQLModule } from '@nestjs/graphql';
    import { join } from 'path';
    import { ChatModule } from './chat/chat.module';
    import { ChatService } from './chat/chat.service';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot(typeOrmConfig), // connect to database
        GraphQLModule.forRoot({
          debug: true,
          playground: true,
          typePaths: ['**/*.graphql'],
          definitions: {
            path: join(process.cwd(), 'src/graphql.ts'),
          },
        }),
        AuthModule,
        ChatModule,
      ],
      controllers: [],
      providers: [
      ],
    })
    export class AppModule {
    }
    
    import { Module } from '@nestjs/common';
    import { ChatService } from './chat.service';
    import { ChatResolver } from './chat.resolver';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { AuthModule } from '../auth/auth.module';
    import { PubSub } from 'graphql-subscriptions';
    
    @Module({
      imports: [
        // Add all repository here; productRepository, ...
        TypeOrmModule.forFeature( [
          // repositories ...
        ]),
        AuthModule
      ],
      providers: [
         //=> How to replace with socket.io ?
         {
           provide: 'PUB_SUB',
           useValue: new PubSub(),
        },
        ChatService, 
        ChatResolver,
      ]
    })
    export class ChatModule {}
    
    Chat.resolver.ts

    import { Resolver, Query, Mutation, Args, Subscription } from '@nestjs/graphql';
    import { PubSubEngine  } from 'graphql-subscriptions';
    import { Inject } from '@nestjs/common';
    
    const PONG_EVENT_NAME = 'pong';
    
    @Resolver('Chat')
    export class ChatResolver {
        constructor(
            private chatService: ChatService,
    
            @Inject('PUB_SUB') 
            private pubSub: PubSubEngine,
        ) {}
    
        // Ping Pong
        @Mutation('ping')
        async ping() {
            const pingId = Date.now();
            //=> How to send deta to specific client by using user-id?
            this.pubSub.publish(PONG_EVENT_NAME, { ['pong']: { pingId } });
            return { id: pingId };
        }
    
        @Subscription(PONG_EVENT_NAME)
        pong() {
            //=> how to get data about sender like id?
            return this.pubSub.asyncIterator(PONG_EVENT_NAME);
        }
    }
    
    
    Chat.graphql

    type Mutation {
        ping: Ping
    }
    
    type Subscription {
      tagCreated: Tag
      clientCreated: Client
      pong: Pong
    }
    
    type Ping {
      id: ID
    }
    
    type Pong {
      pingId: ID
    }
    

    如何用Socket.io替换PubSub?

    我没有找到从graphql订阅获取客户端套接字的任何解决方案或示例。
    在大多数示例中,它们使用网关而不是graphql pubsub。因此,我使用GateWay实现实时活动,并使用graphql实现其他请求。

    我没有找到任何解决方案或示例来从graphql订阅中获取客户端套接字。 在大多数示例中,它们使用网关而不是graphql pubsub。所以我使用GateWay实现实时活动,并使用graphql实现其他请求