【问题标题】:How to use socket.io with graphql subscription?如何将 socket.io 与 graphql 订阅一起使用?
【发布时间】:2020-10-21 01:24:29
【问题描述】:

我想用nestjs和graphql技术做一个实时聊天应用。大多数教程都使用 PubSub,但我不知道如何向特定客户端发送消息(?)。 我认为使用 socket.io 通过使用套接字 id 向特定客户端发送消息非常容易。

这个使用 PubSub 的例子:

  1. 是否可以使用 PubSub 向特定客户端发送消息?通过接收一些关于发件人的数据,例如 id。
  2. 如何将 PubSub 替换为 Socket.io?我对 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 {
}

聊天模块.ts

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?

【问题讨论】:

    标签: socket.io graphql nestjs publish-subscribe subscription


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2017-03-17
      • 2017-11-11
      • 2021-10-27
      • 2022-06-18
      • 2019-03-02
      • 2012-03-14
      • 2015-06-24
      • 2019-11-27
      相关资源
      最近更新 更多