Передать результат функции в мутацию graphql - PullRequest
0 голосов
/ 11 декабря 2018

Моя checker() функция определяет, есть ли совпадение ввода (зарегистрированного числа) пользователя в моей базе данных простых чисел.Если есть, мне нужно 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 голосов
/ 11 декабря 2018

Я вижу, что у вас есть преобразователь, но я не видел схему для вашего updateCheckedNumber преобразователя.Для вашего резольвера мы можем создать схему следующим образом:

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

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

Теперь вам понадобится строка запроса, которую вы можете передать в свой реактивный компонент в качестве реквизита.Мы можем сделать это, используя gql из graphql-tag следующим образом:

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

Теперь, когда у нас есть, нам нужно обернуть наш реагирующий компонент с graphql из react-apollo следующим образом:

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

Теперь внутри вашего реагирующего компонента у вас есть доступ к props.updateCheckedNumber, и вы называете его так:

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

Надеюсь, это поможет!

PS Если у вас есть запросто, что дает вам список простых чисел, таких как primeNumbers, вам нужно будет повторить запросы в опциях вызова graphql.Или обновите InMemoryCache вручную.

...