首页 > 解决方案 > 将函数结果传递给 graphql 突变

问题描述

我的checker()函数确定用户的输入 (checkedNumber) 在我的素数数据库中是否匹配。如果有,我需要updateCheckedNumber()运行,以便checkedNumber.matchingPrime使用该素数进行更新。我无法弄清楚如何将质数传递给突变。

这是我的组件的代码。目前,我正在硬编码matchingPrime以更新为“100”。这在数据库中正确反映。

class Prime extends Component {
  updateCheckedNumber = async (checkedNumber) => {
    await this.props.updateCheckedNumber({
      variables: {
        id: checkedNumber.id,
        matchingPrime: checkedNumber.matchingPrime
      },
      update: store => {
        const data = store.readQuery({ query: CheckedNumbersQuery });
        data.checkedNumbers = data.checkedNumbers.map(
          x =>
            x.id === checkedNumber.id
            ? {
                ...checkedNumber, matchingPrime: "100"
              }
            : x
        );
        store.writeQuery({ query: CheckedNumbersQuery, data });
      }
    })
  }

  checker = () => {
    let primes = (this.props.data.primeNumbers)
    let nums = this.props.checkedNumbersFromParent;
    let recentCheckedObject = (nums[nums.length - 1]);
    let recentCheckedNumber = (nums[nums.length - 1].text);
    let recentCheckedRegExp = new RegExp(recentCheckedNumber);
    for (var i in primes) {
      let count = 0;
      if (primes[i].text.search(recentCheckedRegExp) >= 0 && count < 1) {
        count = count + 1;
        this.updateCheckedNumber(recentCheckedObject);
      }
    }
  }

这是我服务器端的解析器:

const resolvers = {
  Query: {
    primeNumbers: () => PrimeNumber.find(),
    checkedNumbers: () => CheckedNumber.find()
  },
  Mutation: {
    createCheckedNumber: async (_, {text}) => {
      const checkedNumber = new CheckedNumber({text, matchingPrime: "nada"});
      await checkedNumber.save();
      return checkedNumber;
    },
    updateCheckedNumber: async (_, {id, matchingPrime}) => {
      await CheckedNumber.findByIdAndUpdate(id, {matchingPrime});
      return true;
    },

非常感谢你看这个。

标签: reactjsmongodbgraphqlreact-apollo

解决方案


我看到您有一个解析器,但我还没有看到您的updateCheckedNumber解析器的架构。给定您的解析器,我们可以制作如下模式:

##updateCheckedNumber.graphql
type Prime {
  id: String
  value: Number
}

type Mutation {
  updateCheckedNumber(id: String!, matchingPrime: Number!): Prime
}

现在您将需要一个查询字符串,您可以将其作为道具传递到您的反应组件中。我们可以使用gqlfrom来做到这一点graphql-tag,如下所示:

const updateCheckedNumber = gql`
  mutation updateCheckedNumber($id: String!, $matchingPrime: Number!) {
    updateCheckedNumber(id: $id, matchingPrime: $matchingPrime) {
      id,
      value
    }
  }
`

现在我们已经有了,我们需要用graphqlfrom包装我们的反应组件,react-apollo如下所示:

export default graphql(updateCheckedNumber, {
  name: 'updateCheckedNumber'
})(MyReactComponent)

现在在您的反应组件中,您可以访问props.updateCheckedNumber并这样称呼它:

props.updateCheckedNumber({
  variables: {
    id: theId,
    matchingPrime: theCheckedNumber
  }
})

希望这可以帮助!

PS 如果您有一个 Query 可以为您提供质数列表,例如primeNumbers,您将需要在graphql调用的选项中重新获取 Queries。或者InMemoryCache手动更新。


推荐阅读