reactjs - 通过 GRAPHQL 订阅传递数据仅在其中一个参数上给出 null

标签 reactjs graphql subscription graphql-js

我有以下 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}}

我知道我可能以某种方式错误地设置了订阅,但我没有看到问题。

最佳答案

根据您的架构,返回的所需 data 应如下所示:

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

第一个bookingSubscription上的字段,第二个booking是SubscriptionData上的字段。您传递给 publish 的对象应该具有相同的形状(即它应该始终包含根级订阅字段)。

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

关于reactjs - 通过 GRAPHQL 订阅传递数据仅在其中一个参数上给出 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60128715/

相关文章:

reactjs - 如何将react-intl 2与redux一起使用?

javascript - 每次发出都会触发 io.on 连接

go - 在Go中创建循环GraphQL类型

GraphQL - 在联合中使用不同类型的相同字段名称

ruby-on-rails - 如何取消 Paypal 订阅?

android - Android 应用内订阅购买日期是否会随着每月续订而更新?

javascript - 为什么 React 函数组件的 "this"未定义

javascript - React Navigation,问题查找文件

graphql - 考虑到变异的输入类型,如何在 GraphQL 中设计模式?

javascript - 如何使用 ngx-auto-unsubscribe 测试我是否已取消订阅?