有没有办法摆脱GraphQL中的[Object:null prototype]

时间:2018-12-31 03:30:49

标签: javascript node.js graphql apollo-server

我正在尝试使用Mongoose和GraphQL建立一对多关系数据库。

每当我将数据插入graphql突变参数时,都会出现[Object:null prototype]错误

当我尝试用console.log进行调试时,我注意到对象的前面有[Object:null prototype]。

我尝试了很多方法,尝试了map()args甚至使用replace(),但是没有运气。我得到的只是“ args.ingredient.map/replace不是一个函数”

我已经通过例如更改args测试了硬编码方法

commons

令人惊讶的是,它可以使用这种方法 我认为输入内容不能是对象,而只能是ID。

请参阅下面的实际结果。

解析器

args.category = '5c28c79af62fad2514ccc788'
args.ingredient = '5c28c8deb99a9d263462a086'

TypeDef

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)
    }
}

模型

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' }]
}

4 个答案:

答案 0 :(得分:1)

通常,当将 InputTypes 作为参数传递时,我使用解构来解决它,如下所示:

addRecipe: async (root, { ...args }, { req }, info) => {
   // args.category = '5c28c79af62fad2514ccc788'
   // args.ingredient = '5c28c8deb99a9d263462a086'
   // console.log(args.map(x => x))
   return Recipe.create(args)
}

答案 1 :(得分:0)

您可以执行以下操作,[Object:null prototype]将会消失

const a = JSON.parse(JSON.stringify(args));

答案 2 :(得分:0)

在操场上,我将请求凭据的设置从“忽略”更改为“包含”,并且可以正常工作,"request.credentials": "include"希望对您有所帮助。

答案 3 :(得分:0)

尝试带有 args 参数的 destructuring assignment。您的问题发生是因为 args 是一个包含变异参数的对象。解构后,您将能够直接访问您的参数:

Mutation: {
    addRecipe: async (root, { args }, { req }, info) => {
      return Recipe.create(args)
    }
}