简体   繁体   English

将函数结果传递给graphql突变

[英]Pass function result into graphql mutation

My checker() function determines if a user's input (checkedNumber) has a match in my database of prime numbers. 我的checker()函数确定用户的输入(checkedNumber)在我的素数数据库中是否匹配。 If there is, I need updateCheckedNumber() to run so that checkedNumber.matchingPrime is updated with that prime number. 如果存在,我需要运行updateCheckedNumber() ,以便使用该素数更新checkedNumber.matchingPrime I cannot figure out how to pass the prime number to the mutation. 我不知道如何将素数传递给突变。

Here's the code form my component. 这是我组件的代码。 Currently, I'm hardcoding matchingPrime to be updated to "100." 目前,我硬编码matchingPrime被更新为“100”。 This reflects correctly in the database. 这正确反映在数据库中。

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);
      }
    }
  }

Here are my resolvers from my server side: 这是服务器端的解析器:

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

Thank you very much for looking at this. 非常感谢您查看此内容。

I see you have a resolver, but I haven't seen a schema for your updateCheckedNumber resolver. 我看到您有一个解析器,但是没有看到您的updateCheckedNumber解析器的架构。 Given your resolver we can make a schema as follows: 根据您的解析器,我们可以制作一个如下的架构:

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

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

Now you're going to need a query string that you can pass into your react component as a prop. 现在,您将需要一个查询字符串,您可以将其作为道具传递到您的react组件中。 We can do that using gql from graphql-tag as follows: 我们可以使用来自graphql-tag gql做到这一点,如下所示:

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

Now that we have that we need to wrap our react component with graphql from react-apollo as follows: 现在,我们需要使用来自react-apollo graphql来包装react组件,如下所示:

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

Now inside your react component you have access to props.updateCheckedNumber and you call it like this: 现在,在您的react组件内部,您可以访问props.updateCheckedNumber并且您可以这样称呼它:

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

Hope this helps! 希望这可以帮助!

PS If you have a Query that that gives you a list of the prime numbers, such as primeNumbers , you will need to refetchQueries in the options of the graphql call. PS:如果您有一个查询,该查询为您提供质数列表,例如primeNumbers ,则需要在graphql调用的选项中进行graphql Or update your InMemoryCache manually. 或手动更新您的InMemoryCache

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM