簡體   English   中英

GraphQL:為構建架構提供的類型之一缺少名稱

[英]GraphQL: One of the provided types for building the Schema is missing a name

我正在學習 GraphQL 所以我遇到了一個奇怪的問題

我在一個文件 Schema.js 上有這段代碼:

const graphQL = require('graphql');
const lodash = require('lodash')
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;

const StatusType = new GraphQLObjectType({
name: 'Status',
fields: () => ({
    id: { type: GraphQLInt },
    statusName: { type: GraphQLString },
    user: {
        type: new GraphQLList(UserType),
        resolve(parentValue, args){
            
        }
    }
})
});

const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
    id: { type: GraphQLString },
    username: { type: GraphQLString },
    mail: { type: GraphQLString },
    password: { type: GraphQLString },
    status: { 
        type: StatusType,
        resolve(parentValue, args){
            
        }
    },
})
});

const RouteQuery = new GraphQLObjectType({
name: 'RouteQuery',
user: {
        type: UserType,
        args: { id: { type: GraphQLString } },
        resolve(parentValue, args){
            //return lodash.find(users, { id: args.id })
        }
    },
userSome: {
        type: new GraphQLList(UserType),
        args: { id: { type: GraphQLString } },
        resolve(parentValue, args){
            if (args.id) {
                //return users.filter(user => user.id === args.id);
            }
            //return users;
        }
    },
userAll: {
        type: new GraphQLList(UserType),
        resolve(parentValue){
            //return users
        }
    },
status:{
        type: StatusType,
        args: { id: { type: GraphQLInt } },
        resolve(parentValue, args){
            //return lodash.find(status, { id: args.id })
        }
    },
statusAll: {
        type: new GraphQLList(StatusType),
        resolve(parentValue){
            //return users
        }
    }
    }
});

module.exports = new GraphQLSchema({
query: RouteQuery
})

此代碼成功運行,但是當我嘗試將它們分成多個文件時: const StatusType & UserType如下例所示:StatusType 在 StatusType.js 文件上,而 UserType 在 UserType.js 文件上

StatuType.js 文件:

const graphQL = require('graphql');
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;
const UserType = require('./UserType')
const StatusType = new GraphQLObjectType({
name: 'Status',
fields: () => ({
    id: { type: GraphQLInt },
    statusName: { type: GraphQLString },
    user: {
        type: new GraphQLList(UserType),
        resolve(parentValue, args){
            //return users.filter(user => user.status === parentValue.id);
        }
    }
})
});
module.exports = StatusType;

UserType.js 文件:

const graphQL = require('graphql');
const { GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLSchema, GraphQLList } = graphQL;
const StatusType = require('./StatusType')

const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
    id: { type: GraphQLString },
    username: { type: GraphQLString },
    mail: { type: GraphQLString },
    password: { type: GraphQLString },
    status: { 
        type: StatusType,
        resolve(parentValue, args){
            //return lodash.find(status, { id: parentValue.status })
        }
    },
})
});
module.exports = UserType;

在 Schema.js 文件中,我像這樣包含這兩個:

const StatusType = require('./StatusType');
const UserType = require('./UserType');

因此,我沒有將所有代碼放在同一個文件中,而是將 StatusType 和 UserType 放在各自的文件中。

但是當我運行這段代碼時,我得到了這個錯誤:

在此處輸入圖像描述

所以我不知道這里有什么問題:/

但是當我嘗試 console.log 時,我得到了User作為響應:o 就像它在const UserType = require('./UserType')上的相同代碼上一樣

您在 nodeJs 處理require的方式上遇到了問題。 請參閱http://nodejs.org/api/modules.html#modules_cycles了解如何在節點中處理require

特別是在您的情況下,當您這樣做時:

const StatusType = require('./StatusType');
const UserType = require('./UserType');
  1. const StatusType = require('./StatusType'); StatusType StatusType
  2. StatusType.jsconst UserType = require('./UserType')加載UserType
  3. UserType.js應該需要StatusType但 nodeJs 會阻止這種情況以避免無限循環。 結果,它執行下一行
  4. UserType初始化為new GraphQLObjectType(...)並將fields定義為 function。 function 閉包提供了一個尚未初始化的變量StatusType 它只是一個空的導出模塊{}

您可以驗證添加console.log(StatusType); 創建UserType字段時:

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => {
    console.log(StatusType);
    return ({
      id: { type: GraphQLString },
      username: { type: GraphQLString },
      mail: { type: GraphQLString },
      password: { type: GraphQLString },
      status: {
        type: StatusType,
        resolve(parentValue, args) {

        }
      },
    });
  }
});

你會得到:

{} //instead of StatusType

當所有內容都在同一個文件中時,您不會遇到此問題,因為UserTypeStatusType都在同一個閉包中定義,現在又相互定義。

要解決這個問題,您必須在同一級別上定義UserTypeStatusType並注入它們。 可以在此處找到如何執行此操作的一個很好的示例。 在你的情況下:

// StatusType.js
const StatusType = (types) => new GraphQLObjectType({
  name: 'Status',
  fields: () => {
    console.log(types.UserType);
    return ({
      id: { type: GraphQLInt },
      statusName: { type: GraphQLString },
      user: {
        type: new GraphQLList(types.UserType),
        resolve(parentValue, args) {

        }
      }
    });
  }
});

module.exports = StatusType;

// UserType.js
const UserType = (types) => new GraphQLObjectType({
  name: 'User',
  fields: () => {
    console.log(types.StatusType);
    return ({
      id: { type: GraphQLString },
      username: { type: GraphQLString },
      mail: { type: GraphQLString },
      password: { type: GraphQLString },
      status: {
        type: types.StatusType,
        resolve(parentValue, args) {

        }
      },
    });
  }
});
module.exports = UserType;

// Schema.js
const StatusTypeInject = require('./StatusType');
const UserTypeInject = require('./UserType');

const types = {};
types.StatusType = StatusTypeInject(types);
types.UserType = UserTypeInject(types);

const StatusType = types.StatusType;
const UserType = types.UserType;

您可以在這里進行一些清理,這是我解決這些情況的方法:

[..]
// import GraphQLNonNull from the graphql lib
// In your case, I'd use GraphQLID instead of GraphQLString

userSome: {
  type: new GraphQLList(require('../path/to/UserType')),
  args: { id: { type: new GraphQLNonNull(GraphQLID) } },
  resolve: async (parentValue, args) => {
    // No need for the if statement as we'd sure to have an id.
    // return await filter users by id.
  }
},
[..]

和往常一樣,將您的fields保留為函數: fields: () => ({})

注入解決了這個錯誤

 // StatusType.js const StatusType = (types) => new GraphQLObjectType({ name: 'Status', fields: () => { console.log(types.UserType); return ({ id: { type: GraphQLInt }, statusName: { type: GraphQLString }, user: { type: new GraphQLList(types.UserType), resolve(parentValue, args) { } } }); } }); module.exports = StatusType;

在您的目錄中創建一個 types.js 文件。 在這里,您可以添加與其他類型集成的所有類型並注入所需的類型。

 const UserTypeInject = require("./UserType"); const StatusTypeInject = require("./Author"); const types = {}; types.UserType = UserTypeInject(types); types.StatusType = StatusTypeInject(types); const UserType = types.UserType; const StatusType = types.StatusType; module.exports = { UserType, StatusType };

每當您需要 Mutations 或 Queries 中的類型時,您都可以從 types.js 文件中導入它;

 const { UserType } = require("../types");

https://i.stack.imgur.com/ORvCG.png

請參閱上面的圖像和代碼行: 5. 我正在使用Mutation GraphQL 將數據插入到我的客戶端集合中,並對 ClientType ('ClientType') 使用單引號並得到相同的錯誤。 我剛剛刪除了一個單引號,因為該類型需要客戶端 GraphQLObjectType,並且我將 ClientType 作為字符串提供。

我搜索了2天。 希望它會幫助任何人。

您在聲明之前在 StatusType 中導入 UserType。

const StatusType = require('./StatusType');
const UserType = require('./UserType');

暫無
暫無

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

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