簡體   English   中英

對GraphQL中的嵌套類型進行深度查詢返回NULL

[英]Deep query to nested types in GraphQL return NULL

有一個奇怪的問題...

查詢嵌套類型返回null。

但是,如果我返回父類型的任何內容,請返回正確的結果

我的代碼:

import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';

const AdminType = new GraphQLObjectType({
    name: 'AdminType',
    fields: {
        _id: { type: GraphQLID },
        login: { type: GraphQLString },
        password: { type: GraphQLString }
    }
});

const AdminRooteType = new GraphQLObjectType({
    name: 'AdminRooteType',
    fields: {
        getAdmins: {
            type: new GraphQLList(AdminType),
            resolve() {
                return AdminModel.find({})
            }
        }
    }
})

export default new GraphQLSchema({ 
    query: new GraphQLObjectType({
        name: 'RootQuery',
        fields: {
            admin: {
                type: AdminRooteType,
                resolve() {
                   // EMPTY RESOLVE - EMPTY RESULT
                }
            }
        }
    })
 });

查詢:

{
  admin {
    getAdmins {
      login
    } 
  }
}

結果:

{
  "data": {
    "admin": null
  }
}

如果我在RootQuery的admin字段中更改了返回值:

import { GraphQLList, GraphQLString, GraphQLID, GraphQLObjectType, GraphQLSchema } from 'graphql';
import AdminModel from '../models/Admin.model';

const AdminType = new GraphQLObjectType({
    name: 'AdminType',
    fields: {
        _id: { type: GraphQLID },
        login: { type: GraphQLString },
        password: { type: GraphQLString }
    }
});

const AdminRooteType = new GraphQLObjectType({
    name: 'AdminRooteType',
    fields: {
        getAdmins: {
            type: new GraphQLList(AdminType),
            resolve() {
                return AdminModel.find({})
            }
        }
    }
})

export default new GraphQLSchema({ 
    query: new GraphQLObjectType({
        name: 'RootQuery',
        fields: {
            admin: {
                type: AdminRooteType,
                #resolve() {#
                    #// RETURN ANYTHING HERE:#
                  #  return 'foobar'#
                }
            }
        }
    })
 });

我有預期的結果:

{
  "data": {
    "admin": {
      "getAdmins": [
        {
          "login": "123"
        },
        {
          "login": "12asdf3"
        }
      ]
    }
  }
}

什么是解決此問題的正確方法? (不使用虛擬值作為回報)

非常感謝!

您所看到的是預期的行為。 假設我們有一個User類型,其中包含一些字段:

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: {
    id: { type: GraphQLID },
    name: { type: GraphQLString },
  }
})

還有一種獲取單個用戶的方法:

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    user: {
      type: AdminRooteType,
      resolve: () => getUser(),
    },
  },
})

如果getUser返回表示User的對象,則將調用所有字段的解析程序(即, User類型上的idname

當這些字段(以及它們可能具有的任何子字段)解析后,您將得到一個User對象,整個user字段都將返回。 響應可能類似於:

"data": {
  "user": {
    "id": 1,
    "name": "Maria",
    "comments": [
      {
        "id": 1,
        // and so on...
      }
    ]
  }
}

現在,考慮當找不到用戶而我們返回null時會發生什么。 我們的回應如下:

"data": {
  "user": null
}

為“用戶”字段調用任何解析程序都沒有道理。 在這種情況下,您是否希望API仍返回idname 如果這樣做的話,這些字段將具有什么值? 如果我們只是返回一個空的idname ,客戶端將如何將該對象與一個已存在但確實具有idname null值的用戶區分開?

關鍵是,如果字段返回GraphQLObjectType且解析為null,則不會調用GraphQLObjectType上的任何解析器。

通過不必要地將getAdmins字段嵌套在另一個GraphQLObjectType中,您被迫在解析器中返回admin某種對象。 因此,您將需要忍受這一點,或者避免完全創建AdminRootType而只需按照getAdminsgetAdmins字段直接放在查詢類型上:

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    getAdmins: {
      type: new GraphQLList(AdminType),
      resolve: () => AdminModel.find({}),
    },
  },
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM