将函数结果传递给graphql突变

时间:2018-12-11 07:55:30

标签: reactjs mongodb graphql react-apollo

我的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;
    },

非常感谢您关注此内容。

1 个答案:

答案 0 :(得分:0)

我看到您有一个解析器,但没有看到您的updateCheckedNumber解析器的架构。根据您的解析器,我们可以制作一个如下的架构:

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

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

现在您将需要一个查询字符串,您可以将其作为道具传递到您的react组件中。我们可以使用gql中的graphql-tag进行以下操作:

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

现在,我们需要使用graphql中的react-apollo来包装react组件,如下所示:

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

现在在您的react组件内部,您可以访问props.updateCheckedNumber并按如下方式调用它:

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

希望这会有所帮助!

P.S。如果您有一个查询,该查询为您提供了质数列表,例如primeNumbers,则需要在graphql调用的选项中进行refetchQueries。或手动更新您的InMemoryCache