Я пытаюсь создать базу данных отношений «один ко многим» с Mongoose и GraphQL.
Всякий раз, когда я вставляю данные в аргумент мутации GraphQL, я получаю ошибку [Object: null prototype].
Я заметил, что перед объектом будет [Object: null prototype], когда я попытался использовать console.info для отладки.
Я пробовал много способов, пробовал аргументы map() или даже использовать replace(), но безуспешно. Все, что я получил, это "args.ingredient.map/replace is not a function"
Я протестировал жестко закодированный метод, изменив аргументы, например:
args.category = '5c28c79af62fad2514ccc788'
args.ingredient = '5c28c8deb99a9d263462a086'
Удивительно, но этот метод работает. Я предполагаю, что ввод не может быть объектом, а просто идентификатором.
Ниже приведены фактические результаты.
Резольверы
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.info(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!
}
Модели
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)
Это результат, в котором я консоль регистрирую аргументы при вставке данных
{
name: 'Butter Milk Chicken TEST2',
direction: [ 'Step1', 'Step2', 'Step3' ],
ingredient:[[Object: null prototype] { id: '5c28c8d6b99a9d263462a085' }],
category: [[Object: null prototype] { id: '5c28c79af62fad2514ccc788' }]
}
Я полагаю, мне нужно получить что-то вроде этого
{
name: 'Butter Milk Chicken TEST2',
direction: [ 'Step1', 'Step2', 'Step3' ],
args.category = ['5c28c79af62fad2514ccc788']
args.ingredient = ['5c28c8ccb99a9d263462a083', '5c28c8d3b99a9d263462a084', '5c28c8d6b99a9d263462a085']
}
Где именно у вас стоит "ошибка get [Object: null prototype]", в строке Recipe.create? Не могли бы вы опубликовать полное сообщение об ошибке?
Я зарегистрировал проблему в проекте apollo: github.com/apollographql/apollo-server/issues/3149
Это было очень быстро исправлено в firestore. github.com/googleapis/nodejs-firestore/pull/736



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сделать что-то подобное, и [Object: null prototype] исчезнет
const a = JSON.parse(JSON.stringify(args));
args.category - это
[[Object: null prototype] { id: '5c28c79af62fad2514ccc788' }],
JSON.parse (JSON.stringify (args.category) будет { id: '5c28c79af62fad2514ccc788' }
Пожалуйста, объясните свой ответ.
@amanb причина, по которой это работает, потому что вы сначала используете JSON.strigify(args), преобразуя значение аргументов из [[Object: null prototype] {id: '5c28c79af62fad2514ccc788'}] в [{id: '5c28c79af62fad2514ccc788'}], а затем с помощью JSON.parse вы преобразовать его в допустимое значение JS. В моем случае я предпочел сделать JSON.strigify(args[0]), чтобы добиться желаемого результата { name: 'test', type: 'A' }.
У нас была эта проблема. Мы искали запрос к объекту службы в базе данных, для которого была указана цена.
Ожидаемый результат:
service: {
price: 9999
}
Однако мы случайно запросили «услуги» (вместо «услуги»), которые дали нам массив цен (только с одной ценой), например:
[ [Object: null prototype] { price: 9.99 } ]
Это было вызвано неверным запросом.
Как только мы изменили запрос на «сервис» (вместо «сервисы»), данные вернулись, как и ожидалось, без нулевого прототипа.
Мы используем Prisma в качестве нашей ORM, но, возможно, вы запрашиваете рецепты, когда вам следует запрашивать рецепт.
Я получаю нулевой прототип, когда запускаю мутацию create и также возвращаю результаты, поэтому не уверен, что это связано с именованием.
На игровой площадке я изменил учетные данные запроса настроек с опускания на включение, и это сработало, "request.credentials": "include", надеюсь, поможет.
Попробуйте деструктуризация с параметром аргументы. Ваша проблема возникает из-за того, что аргументы - это объект, содержащий аргументы мутации. После его деструктуризации вы сможете напрямую получить доступ к своему аргументу:
Mutation: {
addRecipe: async (root, { args }, { req }, info) => {
return Recipe.create(args)
}
}
Обычно, передавая InputTypes в качестве аргумента, я решаю его с помощью деструктуризации, например:
addRecipe: async (root, { ...args }, { req }, info) => {
// args.category = '5c28c79af62fad2514ccc788'
// args.ingredient = '5c28c8deb99a9d263462a086'
// console.info(args.map(x => x))
return Recipe.create(args)
}
Откуда бы взялись массивы?