将函数结果传递给 graphql 突变

Posted

技术标签:

【中文标题】将函数结果传递给 graphql 突变【英文标题】:Pass function result into graphql mutation 【发布时间】:2019-05-12 04:15:36 【问题描述】:

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

非常感谢您查看此内容。

【问题讨论】:

你在用react-apollo吗? 是的,我正在使用 react-apollo 因为需要房间,我将发布一个答案。它可能无法一劳永逸地解决它。 明白。非常感谢,凯尔。 【参考方案1】:

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

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


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

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

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

现在我们需要用来自react-apollographql 包装我们的反应组件,如下所示:

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

现在在你的 react 组件中,你可以访问 props.updateCheckedNumber,你可以这样称呼它:

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

希望这会有所帮助!

附:如果您有一个提供素数列表的查询,例如primeNumbers,您将需要在graphql 调用的选项中重新获取查询。或者手动更新您的InMemoryCache

【讨论】:

谢谢@KyleRichardson。我仍然不确定如何将匹配的素数传递给updateCheckedNumberchecker() 函数告诉我是否可以找到与 recentCheckedNumber 匹配的素数。但是我如何获取那个素数并将其添加到checkedNumber.matchingPrime?当我简单地将primeNumber 传递给updateCheckedNumber() 时,我得到一个未定义的错误。再次感谢您的帮助

以上是关于将函数结果传递给 graphql 突变的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL - 将枚举值作为参数直接传递给突变?

使用 ApolloClient 将变量传递给 GraphQL 突变似乎不起作用

如何在 GraphQL 突变中使用 FaunaDB 将数组传递给字段

如何在反应js中将graphql列表传递给apollo中的突变

React Native、GraphQL、Apollo - 如何创建批量插入突变

无法在 GraphQL 突变中传递数组 - React Native