Связь между схемами 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
вместо строк в качестве основных идентификаторов.