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





Вы передаете глобальный идентификатор 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. <- Эта ошибка возникает из-за того, что передается идентификатор типа.
Ошибка указывает на то, что значение переменной
slugне определено, поэтому вы, вероятно, неправильно передаете переменную. Пожалуйста, включите соответствующий код, который показывает, как вы на самом деле используете этот запрос в своем приложении.