是否可以在同一个对象中有一个 objectType

Posted

技术标签:

【中文标题】是否可以在同一个对象中有一个 objectType【英文标题】:Is it possible to have an objectType within the same object 【发布时间】:2020-05-30 11:11:11 【问题描述】:

我一直在尝试获取它,以便我可以在培训类型中放置多个“培训”,因为一旦用户拥有两者,它们就会相互合并。但是我似乎无法让它工作,而且我不知道如何去做。

这是我的训练模型:

const mongoose = require('mongoose')
const Schema = mongoose.Schema

let trainingSchema = new Schema(
  name: 
    type: String,
    required: true,
    unique: true
  ,
  shortHand: 
    type: String,
    required: true,
    unqiue: true
  ,
  desc:  type: String ,
  office: 
    type: Schema.Types.ObjectId,
    ref: "Office"
  ,
  isMerge:  type: Boolean, default: false,
  mergeInto: [
    type: Schema.Types.ObjectId,
    ref: "Training"
  ]
)

module.exports = mongoose.model('Training', trainingSchema)

这是我的训练对象

/**
 * Defines Training Type
 */
const TrainingType = new GraphQLObjectType(
  name: "Training",
  fields: 
    id:  type: GraphQLID ,
    name:  type: GraphQLString ,
    shortHand:  type: GraphQLString ,
    desc:  type: GraphQLString ,
    office:  
      type: require('./office').OfficeType,
      resolve: async (office) => 
        return await Office.findById(office.office)
      
    ,
    isMerge:  type: GraphQLBoolean ,
    mergeInto:  
      type: new GraphQLList(TrainingType), // This is the error line
      resolve: async (training) => 
        return await Training.find(id: training.id)
      
    
  
)
module.exports.TrainingType = TrainingType

现在显然我得到的错误是 TrainingType 未定义,因为我正在尝试使用尚未完全定义的东西。但是我尝试了其他方法,例如制作一个名为 MergesInto 的不同 objectType,然后在另一个中使用它。但这也不起作用,因为一个需要另一个,并且必须在另一个之前定义一个,这会给我错误未定义。我似乎无法弄清楚如何让它工作。这甚至可能吗?

【问题讨论】:

【参考方案1】:

fields 可以是对象,也可以是返回 1 的函数。将其设为函数会延迟函数内部代码的执行,因此您可以毫无错误地引用TrainingType 变量。

const TrainingType = new GraphQLObjectType(
  name: "Training",
  fields: () => (
    ...
    mergeInto:  
      type: new GraphQLList(TrainingType),
      ...
    ,
  )
)

【讨论】:

以上是关于是否可以在同一个对象中有一个 objectType的主要内容,如果未能解决你的问题,请参考以下文章

测试数据时如何避免空指针异常

使用 RKObjectMapping 进行递归映射?

将 Typegoose 与 GraphQL 一起使用

具有基于参数的动态字段的 GraphQL ObjectType

在垃圾回收器中有哪几种判断是否需要被回收的几种方法

什么是JavaScript的原始值?