J'essaie de créer une base de données de relations un-à-plusieurs avec Mongoose
et GraphQL
.
Chaque fois que j'insère les données dans l'argument de mutation GraphQL, j'obtiens l'erreur [Object: null prototype]
.
Je remarque que l'objet aura [Object: null prototype]
Devant lui lorsque j'ai essayé de console.log
À des fins de débogage.
J'ai essayé de nombreuses façons, essayé de map()
args ou même d'utiliser replace()
mais pas de chance. Tout ce que je reçois, c'est "args.ingredient.map/replace is not a function"
J'ai testé la méthode codée en dur en changeant les arguments par exemple:
args.category = '5c28c79af62fad2514ccc788'
args.ingredient = '5c28c8deb99a9d263462a086'
Étonnamment, cela fonctionne avec cette méthode. Je suppose que l'entrée ne peut pas être un objet mais simplement un ID.
Reportez-vous ci-dessous pour les résultats réels.
Résolveurs
Query: {
recipes: async (root, args, { req }, info) => {
return Recipe.find({}).populate('ingredient category', 'name createdAt').exec().then(docs => docs.map(x => x))
},
},
Mutation: {
addRecipe: async (root, args, { req }, info) => {
// args.category = '5c28c79af62fad2514ccc788'
// args.ingredient = '5c28c8deb99a9d263462a086'
// console.log(args.map(x => x))
return Recipe.create(args)
}
}
TypeDef
extend type Mutation {
addRecipe(name: String!, direction: [String!]!, ingredient: [IngredientInput], category: [CategoryInput]): Recipe
}
type Recipe {
id: ID!
name: String!
direction: [String!]!
ingredient: [Ingredient!]!
category: [Category!]!
}
input IngredientInput {
id: ID!
}
input CategoryInput {
id: ID!
}
Des modèles
const recipeSchema = new mongoose.Schema({
name: String,
direction: [String],
ingredient: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Ingredient' }],
category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' }
}, {
timestamps: true // createdAt, updateAt
})
const Recipe = mongoose.model('Recipe', recipeSchema)
C'est le résultat que je console consigner les arguments lors de l'insertion des données
{
name: 'Butter Milk Chicken TEST2',
direction: [ 'Step1', 'Step2', 'Step3' ],
ingredient:[[Object: null prototype] { id: '5c28c8d6b99a9d263462a085' }],
category: [[Object: null prototype] { id: '5c28c79af62fad2514ccc788' }]
}
Je suppose que je dois obtenir quelque chose comme ça
{
name: 'Butter Milk Chicken TEST2',
direction: [ 'Step1', 'Step2', 'Step3' ],
args.category = ['5c28c79af62fad2514ccc788']
args.ingredient = ['5c28c8ccb99a9d263462a083', '5c28c8d3b99a9d263462a084', '5c28c8d6b99a9d263462a085']
}
Nous avons eu ce problème. Nous cherchions à interroger un objet de service dans la base de données qui avait un prix dessus.
Résultat attendu:
service: {
price: 9999
}
Cependant, nous avons accidentellement demandé des "services" (au lieu de "service") qui nous ont donné une gamme de prix (avec un seul prix) comme ceci:
[ [Object: null prototype] { price: 9.99 } ]
Cela était dû à une mauvaise requête.
Une fois que nous avons changé la requête en "service" (au lieu de "services"), les données sont revenues comme prévu sans le prototype nul.
Nous utilisons Prisma comme ORM, mais peut-être que vous recherchez des recettes alors que vous devriez demander une recette.
Dans la cour de récréation, j'ai changé les paramètres de demande d'informations d'identification d'omis à inclure et cela a fonctionné, "request.credentials": "include"
J'espère que ça aide.