Возможно ли иметь objectType в том же объекте - PullRequest
0 голосов
/ 14 февраля 2020

Я пытался получить его, чтобы я мог поместить несколько «тренингов» в тип тренинга, если они будут сливаться друг с другом, как только пользователь получит и то, и другое. Однако я не могу заставить его работать, и я озадачен тем, как go об этом.

Вот моя обучающая модель:

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)

и вот мое обучение object

/**
 * 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 не определен, так как я пытаюсь использовать что-то, что еще не было полностью определено. Но я пробовал другие способы, такие как создание другого objectType с именем MergesInto, а затем использовать его в другом. Но это тоже не работает, так как один требует другого, и один должен быть определен раньше другого, что даст мне ошибку «Не определено». Я не могу понять, как заставить это работать. Это вообще возможно?

1 Ответ

1 голос
/ 14 февраля 2020

fields может быть либо объектом, либо функцией, которая его возвращает. Превращение в функцию задержит выполнение кода внутри функции, поэтому вы можете ссылаться на переменную TrainingType без ошибок.

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