【问题标题】:Pass function result into graphql mutation将函数结果传递给 graphql 突变
【发布时间】: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
  • 因为需要房间,我将发布一个答案。它可能无法一劳永逸地解决它。
  • 明白。非常感谢,凯尔。

标签: reactjs mongodb graphql 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() 时,我得到一个未定义的错误。再次感谢您的帮助
猜你喜欢
  • 2020-02-07
  • 2017-09-22
  • 2020-05-05
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2018-05-22
相关资源
最近更新 更多