Связь между схемами mongoose и GraphQL на сервере Apollo

У меня есть эта db_schema в Mongoose:

      const userSchema = new Schema({
    uid: {
        type: String,
        required: true,
        unique: true,
    },
    name: {
        type: String,
        required: true,
    },
    dept: {
        type: Schema.Types.ObjectId,
        ref: 'Dept',
        required: true,
    },
});

const deptSchema = new Schema({
    did: {
        type: String,
        required: true,
        unique: true,
    },
    name: {
        type: String,
        required: true,
    },
});

const User = model('User', userSchema);
const Dept = model('Dept', deptSchema);

export { User, Dept };

и в GraphQL у меня есть эта схема:

      type User {
  uid: String!
  name: String!
  dept: Dept!
}

type Dept {
  did: String!
  name: String!
}

input DeptInput {
  did: String!,
  name: String!
}


type Mutation {
  createUser(uid: String!, name: String!, dept: DeptInput): User     
}

в преобразователе я делаю:

      Mutation: {
  createUser: async(_, { uid, name, dept }) => {
    try {

      // Create the new user
      const newUser = new User({ uid, name, dept: { did: dept.did, name: dept.name } });
      await newUser.save();

      return newUser;
    } catch (error) {
      throw new Error('Failed to create user');
    }
  }
}

когда я пробую это на детской площадке:

      mutation {
  createUser(uid: "5", name: "osama alatraqchi", dept: {did: "1", name: "CS"}) {
    name uid dept {did name}
  }
}

Я получаю эту ошибку:

       "Failed to create user: Cast to ObjectId failed for value \"1\"
 (type string) at path \"_id\" for model \"Dept\""

Примечание: все работает корректно, вот только проблема сcreateUser()

1 ответ

Твоя проблема только на стороне мангуста, у тебя естьtypeопределяется какObjectIdв вашейuserSchema

      dept: {
        type: Schema.Types.ObjectId, <<<
        ref: 'Dept',
        required: true,
    },
});

Но затем вы проходите мимоstringк вашей мутации:dept: {did: "1"…

Также обратите внимание, что использование новых идентификаторов в качестве параметров мутации, передаваемых из внешнего интерфейса, может быть плохой практикой — лучше всего позволить MongoDB создавать идентификаторы за вас. Также лучше всего использоватьObjectIdsвместо строк в качестве основных идентификаторов.

Другие вопросы по тегам