Передача данных через подписку GRAPHQL дает нулевое значение только для одного из аргументов. - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующая подписка GRAPHQL:

Schema.graphql
    type Subscription {
      booking: SubscriptionData
    }

    type SubscriptionData {
      booking: Booking!
      action: String
    }

И это файл подстановки распознавателя

Resolver/Subscription.js
const Subscription = {
  booking: {
    subscribe(parent, args, { pubsub }, info) {
      return pubsub.asyncIterator("booking");
    }
  }
};

export default Subscription;

Тогда у меня есть следующий код для рассматриваемой мутации

pubsub.publish("booking", { booking: { booking }, action: "test" });

У меня есть следующий файл подписки в переднем конце (React)

const getAllBookings = gql`
  query {
    bookings {
      time
      durationMin
      payed
      selected
      activity {
        name
      }
    }
  }
`;

const getAllBookingsInitial = {
  query: gql`
    query {
      bookings {
        time
        durationMin
        payed
        selected
        activity {
          name
        }
      }
    }
  `
};

class AllBookings extends Component {
  state = { allBookings: [] }

  componentWillMount() {
    console.log('componentWillMount inside AllBookings.js')
    client.query(getAllBookingsInitial).then(res => this.setState({ allBookings: res.data.bookings })).catch(err => console.log("an error occurred: ", err));
  }

  componentDidMount() {
    console.log(this.props.getAllBookingsQuery)
    this.createBookingsSubscription = this.props.getAllBookingsQuery.subscribeToMore(
      {
        document: gql`
          subscription {
            booking {
              booking { 
                time
                durationMin
                payed
                selected
                activity {
                  name
                   }
              }
              action
            }
          }
        `,
        updateQuery: async (prevState, { subscriptionData }) => {
          console.log('subscriptionData', subscriptionData)
          const newBooking = subscriptionData.data.booking.booking;
          const newState = [...this.state.allBookings, newBooking]
          this.setState((prevState) => ({ allBookings: [...prevState.allBookings, newBooking] }))
          this.props.setAllBookings(newState);
        }
      },
      err => console.error(err)
    );
  }
  render() {
    return null;
  }
}

export default graphql(getAllBookings, { name: "getAllBookingsQuery" })(
  AllBookings
);

И я получаю следующий ответ:

data: {
booking: {booking: {...} action: null}}

Я получаю, что я, вероятно, настраиваю подписка как-то не так, но я не вижу проблемы.

1 Ответ

0 голосов
/ 30 января 2020

Исходя из вашей схемы, желаемое возвращаемое значение data должно выглядеть следующим образом:

{
  "booking": {
    "booking": {
      ...
    },
    "action": "test"
  }
}

Первое booking - это поле на Subscription, а второе резервирование - это поле на SubscriptionData. , Объект, который вы передаете publish, должен иметь такую ​​же форму (т. Е. Он всегда должен включать поле подписки root -уровня).

pubsub.publish('booking', {
  booking: {
    booking,
    action: 'test',
  },
})
...