Есть ли способ избавиться от [Object: null prototype] в GraphQL

Я пытаюсь создать базу данных отношений «один ко многим» с 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']
}

Откуда бы взялись массивы?

Bergi 17.02.2019 14:31

Где именно у вас стоит "ошибка get [Object: null prototype]", в строке Recipe.create? Не могли бы вы опубликовать полное сообщение об ошибке?

Bergi 17.02.2019 14:32

Я зарегистрировал проблему в проекте apollo: github.com/apollographql/apollo-server/issues/3149

Jon Stevens 12.08.2019 05:45

Это было очень быстро исправлено в firestore. github.com/googleapis/nodejs-firestore/pull/736

Jon Stevens 23.08.2019 05:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
4
9 767
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете сделать что-то подобное, и [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 17.02.2019 14:41

@amanb причина, по которой это работает, потому что вы сначала используете JSON.strigify(args), преобразуя значение аргументов из [[Object: null prototype] {id: '5c28c79af62fad2514ccc788'}] в [{id: '5c28c79af62fad2514ccc788'}], а затем с помощью JSON.parse вы преобразовать его в допустимое значение JS. В моем случае я предпочел сделать JSON.strigify(args[0]), чтобы добиться желаемого результата { name: 'test', type: 'A' }.

Facu Carbonel 06.01.2021 18:01
Ответ принят как подходящий

У нас была эта проблема. Мы искали запрос к объекту службы в базе данных, для которого была указана цена.

Ожидаемый результат:

service: {
  price: 9999
}

Однако мы случайно запросили «услуги» (вместо «услуги»), которые дали нам массив цен (только с одной ценой), например:

[ [Object: null prototype] { price: 9.99 } ]

Это было вызвано неверным запросом.

Как только мы изменили запрос на «сервис» (вместо «сервисы»), данные вернулись, как и ожидалось, без нулевого прототипа.

Мы используем Prisma в качестве нашей ORM, но, возможно, вы запрашиваете рецепты, когда вам следует запрашивать рецепт.

Я получаю нулевой прототип, когда запускаю мутацию create и также возвращаю результаты, поэтому не уверен, что это связано с именованием.

AlxVallejo 16.04.2019 14:57

На игровой площадке я изменил учетные данные запроса настроек с опускания на включение, и это сработало, "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)
}

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