【问题标题】:GraphQL to query something other than IDGraphQL 查询 ID 以外的内容
【发布时间】:2020-05-01 10:58:57
【问题描述】:

我正在使用 Strapi 和 Nuxt.js 来实现我的第一个 Headless CMS。我正在使用 Apollo 和 GraphQL。

我遇到了当前的错误,我已经好几天没能解决这个问题了。

如果我写:

query Page($id: ID!) {
  page(id: $id) {
    id
    slug
    title
  }
}

并传递以下变量:

{
  "id" : "1"
}

我收到了正确的预期结果:

{
  "data": {
    "page": {
      "id": "1",
      "slug": "/",
      "title": "Homepage"
    }
  }
}

但是,我不想通过 ID 获取内容,而是通过我在 Strapi 中创建的名为“slug”的字段获取内容。 环顾四周,似乎我应该能够执行以下操作:

query Page($slug: String!) {
  page(slug: $slug) {
    id
    slug
    title
  }
}

带变量:

{
  "slug" : "/"
}

但我收到此错误:

{
  "error": {
    "errors": [
      {
        "message": "Unknown argument \"slug\" on field \"page\" of type \"Query\".",
        "locations": [
          {
            "line": 2,
            "column": 8
          }
        ],
        "extensions": {
          "code": "GRAPHQL_VALIDATION_FAILED",
          "exception": {
            "stacktrace": [

...错误继续....

[UPDATE]Italo回复后我改成:

query Pages($slug: String!) {
  page(where: {slug: $slug}) {
    id
    slug
    title
  }
}

但我现在收到以下错误:

{
  "error": {
    "errors": [
      {
        "message": "Unknown argument \"where\" on field \"page\" of type \"Query\".",

我还注意到,如果我将“页面”更改为“页面”,我会收到一个查询,但它会显示所有页面...

我错过了什么? 谢谢!

【问题讨论】:

    标签: graphql nuxt.js apollo strapi


    【解决方案1】:

    要使用主键以外的其他内容(并且仅使用来自 Strapi 的默认内置查询)查询一项,您需要使用可用作 where 子句的过滤器:

    query Pages($slug: String!) {
      pages(where: {slug: $slug}) {
        id
        slug
        title
      }
    }
    

    提示:使用 Graphql 界面 http://localhost:1337/graphql 进行测试。 (如果你还没有)

    【讨论】:

    • 您好 Italo,感谢您的回复。是的,我正在使用localhost:1337/graphql 进行测试并进行更改,我现在收到以下错误:“消息”:“查询”类型的字段“页面”上的“未知参数”。 ",
    • 是的,我的错。只需尝试将page(where:) 更改为pages(where:)(要明确,您应该使用查找所有页面的查询,而不是只返回一项的查询)
    • 直接进入graphql界面,使用自动补全(ctrl+空格)查看where字段是否可用。@Saro
    • 是的,它是这样工作的。但是,我必须将其引用为 pages[0].id ,否则我什么也得不到。我确实得到了正确的蛞蝓。我觉得必须使用 [0] 有点不对劲,所以我想知道是否有更好的方法。
    • 使用这种方式并使用pages[0]获取记录是可以的,一点问题都没有。但是如果你想拥有更好的东西,唯一的方法是creating a custom endpoint on graphql schema 这并不难,而且是开始 tweeking stri 的好方法。
    【解决方案2】:

    这似乎对我使用 slug 有用

    在其中创建新文件 schema.graphql.js api/blog-post/config/schema.graphql.js

    module.exports = {
      query: "blogPostBySlug(slug: String!): BlogPost",
      resolver: {
        Query: {
          blogPostBySlug: {
            description: "Return blog post with a given slug",
            resolver: "application::blog-post.blog-post.findOne",
          },
        },
      },
    };
    

    更改 api/blog-post/config/routes.json 中的 routes.json,从 "path": "/blog-posts/:id" 到 "path": "/blog-posts/:slug:

    {
      "method": "GET",
      "path": "/blog-posts/:slug",
      "handler": "blog-post.findOne",
      "config": {
        "policies": []
      }
    },
    

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2020-12-03
      • 1970-01-01
      • 2019-06-11
      • 2020-08-18
      • 2018-06-13
      • 2019-01-20
      • 2021-04-17
      • 2020-11-02
      相关资源
      最近更新 更多