graphql-ws.1(NestJs)

김종민·2022년 9월 9일
0

Nuber-Server

목록 보기
31/34


어쩔수 없는 subscription
graphql에서
graphql-ws만 남기고 없앤다고 한다.
가장 어려운 부분임.

app.module.ts


    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      autoSchemaFile: true,
      subscriptions: {
        'graphql-ws': {
          onConnect: (context: Context<any>) => {
            const { connectionParams, extra } = context;
            // console.log('connectionParams', connectionParams);
            // console.log('connectionParams', connectionParams);
            // console.log('context', context);
            // console.log('context', extra);
          },
        },
      },
      context: ({ req, connection }) => {
        if (req) {
          return { user: req['user'] };
        } else {
          console.log(connection);
        }
      },
    })
    

orders.resolvers.ts

import { PubSub } from 'graphql-subscriptions';

const pubsub = new PubSub();
.
.
.
.

  @Mutation(() => Boolean)
  potatoReady() {
    pubsub.publish('hotPotatos', { readyPotato: 'I love you' });
    return true;
  }

  @Subscription(() => String)
  readyPotato() {
    return pubsub.asyncIterator('hotPotatos');
  }

이렇게 하면,
readyPotato를 실행하면 subscription 구독하고,
potatoReady를 실행하면 publish 한다.

!!구독중.
!!graphql-ws로 설정하고 url을 ws://127.0.0.1:3000/graphql로 바꿔줌.

!!trigger 발생시킴.
!!mutation{ potatoReady } 로 trigger함, readyPotato에서 구독중임

HTTP는 req할떄마다, header에 token 혹은 user를 담아서 보내는데,
WS는 한번 connection되면 계속 유지되기 떄문에
한번 connection될때, token이나user를 보내는 방법을
다음 POST에서 알아본다

1. pubsub

publish, subscribe 하기 위해서는 pubsub를 사용해야 함.

1-1. common/common.module.ts

import { Module, Global } from '@nestjs/common';
import { PubSub } from 'graphql-subscriptions';
///PubSub를 graphql-subscriptions으로 부터 import한다.

import { PUB_SUB } from './common.constants';
///PUB_SUB라는 key를 만들어서 constants에 담아 놓았음.

const pubsub = new PubSub();

@Global()
@Module({
  providers: [
    {
      provide: PUB_SUB,
      useValue: pubsub,
    },
  ],
  exports: [PUB_SUB],
})
export class CommonModule {}
///여러 곳에서 사용될 수 있게, 반드시 @Global()로 만들고
///providers와  exports를 잘 봐 놓는다.
///app.modules.ts에서 CommonModule을 담아준다.

1-2. common/common.constants.ts

export const PUB_SUB = 'PUB_SUB';
export const NEW_PENDING_ORDER = 'NEW_PENDING_ORDER';
export const NEW_COOKED_ORDER = 'NEW_COOKED_ORDER';
export const NEW_ORDER_UPDATE = 'NEW_ORDER_UPDATE';
profile
코딩하는초딩쌤

0개의 댓글