wordpress - Gatsby:如何将多个上下文 ID 传递给单个查询?
问题描述
我正在尝试使用它们的 WordPress ID 从单个查询中的两个单独对象获取数据,但是我GraphQLError: The ID input is invalid. Make sure you set the proper idType for your input.
在 WordPress 中使用 GraphQL IDE 它可以按预期获取所有数据,但是我在代码中遇到了该错误。例如,如果我将 idType 设置为字符串,我会得到Variable "$editorId" of type "String!" used in position expecting type "ID!".
gatsby-node.js > createPages 函数:
// Video Detail pages
const {
data: {
cartel: { videoDetailPages },
},
} = await graphql(`
query {
cartel {
videoDetailPages(first: 300) {
nodes {
id
slug
videoDetail {
editor
editorId
}
}
}
}
}
`);
const videoDetailTemplate = path.resolve(`./src/templates/videoDetail.js`);
videoDetailPages.nodes.forEach(page => {
const editorSlug = page.videoDetail.editor.replace(' ', '-').toLowerCase();
const { editorId } = page.videoDetail;
createPage({
// will be the url for the page
path: `${editorSlug}/${page.slug}`,
// specify the component template of your choice
component: slash(videoDetailTemplate),
// In the ^template's GraphQL query, 'id' will be available
// as a GraphQL variable to query for this page's data.
context: {
id: page.id,
editorId,
},
});
});
页面模板查询:
export const query = graphql`
query($id: ID!, $editorId: ID!) {
cartel {
videoDetailPage(id: $id) {
videoDetail {
client
director
duration
editor
productionCompany
videoStill {
altText
sourceUrl
}
videoUrl
title
}
}
}
cartel {
editorDetailPage(id: $editorId) {
editorDetail {
editorVideos {
pagePath
image {
altText
sourceUrl
title
}
}
}
}
}
}
`;
盖茨比信息:
System:
OS: macOS 10.15.7
CPU: (12) x64 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz
Shell: 5.7.1 - /bin/zsh
Binaries:
Node: 10.23.0 - ~/.nvm/versions/node/v10.23.0/bin/node
Yarn: 1.22.4 - /usr/local/bin/yarn
npm: 6.14.8 - ~/.nvm/versions/node/v10.23.0/bin/npm
Languages:
Python: 2.7.16 - /usr/bin/python
Browsers:
Chrome: 91.0.4472.77
Firefox: 87.0
Safari: 14.1
npmPackages:
gatsby: ^2.24.36 => 2.32.13
gatsby-image: ^2.4.14 => 2.11.0
gatsby-plugin-accessibilityjs: ^1.0.3 => 1.0.3
gatsby-plugin-google-tagmanager: ^2.3.11 => 2.11.0
gatsby-plugin-manifest: ^2.4.22 => 2.12.1
gatsby-plugin-offline: ^2.2.7 => 2.2.10
gatsby-plugin-react-helmet: ^3.3.10 => 3.10.0
gatsby-plugin-remove-trailing-slashes: ^2.3.11 => 2.10.0
gatsby-plugin-sass: ^2.3.12 => 2.8.0
gatsby-plugin-sharp: ^2.6.25 => 2.14.4
gatsby-plugin-sitemap: ^2.4.11 => 2.12.0
gatsby-plugin-web-font-loader: ^1.0.4 => 1.0.4
gatsby-source-filesystem: ^2.3.24 => 2.11.1
gatsby-source-graphql: ^3.4.0 => 3.4.0
gatsby-transformer-sharp: ^2.5.12 => 2.12.1
我没有任何运气发现我做错了什么。
解决方案
你gatsby-node.js
看起来很完美。您的问题是由您发送到模板 ( videoDetailTemplate
) 的数据上下文的类型引起的。你告诉 GraphQL 两者id
和editorId
都是ID
类型,而我猜它们应该是字符串。
我想改变这一行:
query($id: ID!, $editorId: ID!) {
为此应该做的伎俩:
query($id: String!, $editorId: String!) {
正如您从GraphQL 类型定义文档中看到的那样:
标
ID
量类型表示唯一标识符,通常用于重新获取对象或作为缓存的键。ID类型的序列化方式与String相同;但是,将其定义为 anID
意味着它不适合人类阅读。
注意:找出 String 和 ID 类型之间的区别(“将其定义为 anID
表示它不是人类可读的”)
您应该能够在插件设置中为每个字段配置类型:
module.exports = {
plugins: [
{
resolve: "gatsby-source-graphql",
options: {
// Remote schema query type. This is an arbitrary name.
typeName: "WPGraphQL",
// Field name under which it will be available. Used in your Gatsby query. This is also an arbitrary name.
fieldName: "wpcontent",
// GraphQL endpoint, relative to your WordPress home URL.
url: "https://example.com/blog/graphql",
},
},
],
}
此外,您应该能够在通过上下文发送时强制使用parseInt
、Number
、String
等方法的类型。
然后where
按照文档建议使用过滤器:
editorDetailPage(where: { id: $editorId})
videoDetailPage (where: { id: $id})
您能否提供有关您的实现的更多详细信息(插件、配置、版本等)?这似乎是一个错误:
资源:
- 指南
- 问题
推荐阅读
- mysql - 为可以更改的值创建触发器
- python - 如何将字符串转换为日期时间,忽略时间信息?
- python - 移动时 Python GUI 崩溃
- laravel - chmod 权限集在 dockerfile 中不起作用
- java - 未解决的类“FileProvider”
- c# - .Net Native C# 应用程序无法通过 WACK 测试并避免 ILT005 错误
- c# - 将数量金额文本框值从子表单传递到父表单上的变量
- swift - 垂直和水平滚动collectionView选择单元格问题
- r - 为“TRUE”创建给定位置的逻辑向量
- python-3.x - CNN - 如何使用 keras 正确获取 val_loss 和 val_acc?