[Ошибка GraphQL]: Сообщение: Переменная "$slug" требуемого типа "String!" не был предоставлен., Расположение: [объект Объект], Путь: не определен

Я пытаюсь использовать слаг в качестве URL-адреса, но он не работает. Я получаю ошибку в консоли что-то вроде этого.

[GraphQL error]: Message: Variable "$slug" of required type "String!" was not provided., Location: [object Object], Path: undefined

Это мой код. Хотя он отлично работает, если я использую id вместо slug. Я получаю эти данные из wordpress wp-graphql api.

graphql/queries/post.js

import gql from 'graphql-tag';    
export const SinglePostDetail = gql`
  query SinglePostDetail($slug: String!) {
    postBy(slug: $slug) {
      id
      slug
      title
      date
      content
      categories{
        nodes {
          name
        }
      }
      author {
        name
      }
      featuredImage {
        sourceUrl
      }
    }
  }
`;

views/postDetail.js

import React, {Component} from 'react';
import { graphql } from 'react-apollo'
import { SinglePostDetail } from '../graphql/queries/posts'
import Layout from '../components/layout';
import Loader from '../components/Loader/loading';
import './postDetail.scss';

class PostDetail extends Component {   
    constructor () {
        super()
        this.renderPost = this.renderPost.bind(this)
    }
     render() {
         const isLoading = this.props.data.loading
         return (
             <Layout>
                 {isLoading && <Loader/>}
                 {!isLoading && this.renderPost()}
             </Layout>
         )
     }
     renderPost () {
    const post = this.props.data.postBy
    console.info(post);
    const date = new Date(post.date).toLocaleDateString()
    return (
      <div className = " container has-text-centered postdetail__wrapper">
        <h2 className = "subtitle">{post.author.name}</h2>
        <h1 className = "title is-2">{post.title}</h1>

        <h5 className = "subtitle is-7">{post.categories.nodes.name}</h5>
        <h5 className = "subtitle is-7">{date}</h5>
        <img
            alt = {post.title}
            src = {post.featuredImage && post.featuredImage.sourceUrl}
        />
        <div className = "postdetail__content" dangerouslySetInnerHTML = {{ __html: post.content }} />
      </div>
    )
  }
  }



export default graphql(SinglePostDetail, {
    options: ({match}) => ({variables: {slug: match.params.slug}})
})(PostDetail);

Routes.js

import React from 'react'
import { BrowserRouter,Route, Switch} from 'react-router-dom';
import Home from './views/Home';
import About from './views/About';
import Contact from './views/Contact';
import Category from './views/Category';
import PostDetail from './views/PostDetail';
import Blog from './views/Blog';

function Routes() {
  return (
    <BrowserRouter>
      <Switch>
          <Route path = "/" exact component = {Home}/>
          <Route path = "/about" component = {About}/>
          <Route path = "/blog" component = {Blog}/>          
          <Route path='/category/:slug' component = {Category}/>
          <Route path = "/post/:slug" component = {PostDetail}/>
          <Route path = "/contact" component = {Contact}/>
      </Switch>
    </BrowserRouter>
  )
}

export default Routes

если я зарегистрирую props.data, я получу что-то вроде этого.

console.info(props.data);

error: Error: GraphQL error: No resource could be found at new ApolloError fetchMore: ƒ ()
loading: false
networkStatus: 7
refetch: ƒ ()
startPolling: ƒ ()
stopPolling: ƒ ()
subscribeToMore: ƒ ()
updateQuery: ƒ ()
variables:
slug: "cG9zdDo1NA= = "
__proto__: Object
__proto__: Object

Ошибка указывает на то, что значение переменной slug не определено, поэтому вы, вероятно, неправильно передаете переменную. Пожалуйста, включите соответствующий код, который показывает, как вы на самом деле используете этот запрос в своем приложении.

Daniel Rearden 06.02.2019 05:44

Если зайти match.params.slug в консоль, он определяется?

Daniel Rearden 06.02.2019 05:53

это говорит неопределенное

aditya kumar 06.02.2019 05:57

но он отлично работает в graphiql

aditya kumar 06.02.2019 06:09

Это не проблема GraphQL. Дело в том, что вы запрашиваете параметр, которого, по-видимому, не существует. Каков путь для компонента Route, который соответствует вашему маршрутизатору? Предполагая, что вы используете реактивный маршрутизатор, путь соответствующего маршрута должен включать :slug, чтобы match.params.slug был определен. Например, если ваш путь — /foo/:id, то будет определен match.params.id. Если ваш путь /foo/:bar, тогда будет определен match.params.bar.

Daniel Rearden 06.02.2019 06:41

@DanielRearden Я сделал это, но все равно не работает. Я обновил свой вопрос, посмотрите.

aditya kumar 06.02.2019 10:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
6
5 520
1

Ответы 1

Вы передаете глобальный идентификатор Relay как slug. Вот почему это работает, когда вместо этого вы используете параметр id.

slug: "cG9zdDo1NA= = " <- Это то, что вы передаете как $slug. Вероятно, у вас есть ошибка в том, как вы переходите на страницу. Проверьте свой NavLink или компонент Link, если вы его используете.

Либо измените фактический пост slug, либо измените свой запрос следующим образом.

import gql from 'graphql-tag';    
export const SinglePostDetail = gql`
  query SinglePostDetail($id: ID!) {
    post(id: $id) {
      id
      slug
      title
      date
      content
      categories{
        nodes {
          name
        }
      }
      author {
        name
      }
      featuredImage {
        sourceUrl
      }
    }
  }
`;

[GraphQL error]: Message: Variable "$slug" of required type "String!" was not provided. <- Эта ошибка возникает из-за того, что передается идентификатор типа.

Другие вопросы по теме