Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Error: Material fields must be an object with field names as keys or a function which returns such an object

I have an app with a MongoDB database. I have a Schema with Customers and Tickets and everything was working fine. I’m trying to add a Materials collection, I’ve added it to my Schema and I keep getting this error:

Error: Material fields must be an object with field names as keys or a function which returns such an object.

I’ve tried searching and don’t see any questions exactly like mine, I see the same error someone had, but his was a typo, and I’m not seeing any typos in my code. Doesn’t mean there isn’t one, but I’m not seeing it. Besides the error message, my server seems to crash. I can’t get to GraphiQL by going to http://localhost:5400/graphql

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

If I comment out my Materials entries, everything works fine again.

Here is my Schema:

const Customer = require('../models/Customer');
const Ticket = require('../models/Ticket');
const Material = require('../models/Material');


const { GraphQLObjectType, 
        GraphQLString, 
        GraphQLSchema, 
        GraphQLID, 
        GraphQLList, 
        GraphQLInt, 
        GraphQLNonNull,
        GraphQLDeprecatedDirective,
      } = require('graphql');

//Tickets
const TicketType = new GraphQLObjectType({
  name: 'Ticket',
  fields: () => ({
    id: { type: GraphQLID },
    date: { type: GraphQLString},
    ticketNum: { type: GraphQLString},
    customer: { 
      type: CustomerType,
      resolve(parent, args) {
        return Customer.findById(parent.customerId);
      },
    },
    material: { type: GraphQLString},
    tareWeight: { type: GraphQLInt},
    grossWeight: { type: GraphQLInt},
    netWeight: { type: GraphQLInt},
    notes: { type: GraphQLString},
  }),
});

//Materials
const MaterialType = new GraphQLObjectType({
  name: "Material",
  Fields: () => ({
    id: { type: GraphQLID },
    matId: { type: GraphQLString},
    name: { type: GraphQLString },
    price: { type: GraphQLInt },
    unit: { type: GraphQLString},
    notes: { type: GraphQLString,}
  }),  
});


//Customers
const CustomerType = new GraphQLObjectType({
  name: "Customer",
  fields: () => ({
    id: { type: GraphQLID },
    custId: { type: GraphQLString}, 
    name: { type: GraphQLString}, 
    street: { type: GraphQLString}, 
    city: { type: GraphQLString}, 
    zip: { type: GraphQLString}, 
    webSite: { type: GraphQLString}, 
    email: { type: GraphQLString},
    phone: { type: GraphQLString},
  }),
});

const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: {

    tickets: {
      type: new GraphQLList(TicketType),
      resolve(parent, args) {
        return Ticket.find();
      },
    },
    ticket: {
      type: TicketType,
      args: { id: { type: GraphQLID } },
      resolve(parent, args) {
        return Ticket.findById(args.id);
      },
    },

    customers: {
      type: new GraphQLList(CustomerType),
      resolve(parent, args) {
        return Customer.find();
      },
    },    
    customer: {
      type: CustomerType, 
      args: { id: { type: GraphQLID } },
      resolve(parent, args) {
        return Customer.findById(args.id);
      }, 
    },

    materials: {
      type: new GraphQLList(MaterialType),
      resolve(parent, args) {
        return Material.find();
      },
    },
    material: {
      type: MaterialType,
      args: {id: { type: GraphQLID } },
      resolve(parent, args) {
        return Material.findById(args.id);
      },
    },
  },
});

//Mutations
const mutation = new GraphQLObjectType({
  name: 'Mutation',
  fields: {
    //Add Customer
    addCustomer: {
      type: CustomerType,
      args: {
    custId: { type: GraphQLString}, 
    name: { type: GraphQLString}, 
    street: { type: GraphQLString}, 
    city: { type: GraphQLString}, 
    zip: { type: GraphQLString}, 
    webSite: { type: GraphQLString}, 
    email: { type: GraphQLString},
    phone: { type: GraphQLString},
      },
      resolve(parent, args) {
        const customer = new Customer({
          custId: args.custId,
          name: args.name,
          street: args.street,
          city: args.city,
          zip: args.zip,
          webSite: args.webSite,
          email: args.email,
          phone: args.phone,
        });
        return customer.save();
      }
    },
    // //Add Material
    addMaterial: {
      type: MaterialType,
      args: {
    matId: { type: GraphQLString}, 
    name: { type: GraphQLString}, 
    price: { type: GraphQLString}, 
    unit: { type: GraphQLString}, 
    notes: { type: GraphQLString},
      },
      resolve(parent, args) {
        const material = new Material({
          matId: args.matId,
          name: args.name,
          price: args.price,
          unit: args.unit,
          notes: args.notes,
        });
        return material.save();
      }
    },
    // Delete Customer
    deleteCustomer: {
      type: CustomerType,
      args: {
        id: { type: GraphQLNonNull(GraphQLID) },
      },
      resolve(parent, args) {
        return Customer.findByIdAndRemove(args.id);
      },
    },



    // Add Ticket
    addTicket: {
      type: TicketType,
      args: {
        date: { type: GraphQLNonNull(GraphQLString) },
        ticketNum: { type: GraphQLNonNull(GraphQLString) },
        customerId: { type: GraphQLNonNull(GraphQLID) },
        material: { type: GraphQLNonNull(GraphQLString) },
        tareWeight: { type: GraphQLNonNull(GraphQLInt) },
        grossWeight: { type: GraphQLNonNull(GraphQLInt) },
        netWeight: { type: GraphQLNonNull(GraphQLInt) },
        notes: { type: GraphQLNonNull(GraphQLString) },
      },
      resolve(parent, args) {
        const ticket = new Ticket({
          date: args.date,
          ticketNum: args.ticketNum,
          customerId: args.customerId,
          material: args.material,
          tareWeight: args.tareWeight,
          grossWeight: args.grossWeight,
          netWeight: args.netWeight,
          notes: args.notes,
        });
        return ticket.save();
      }
    },

    //Delete a Ticket
    deleteTicket: {
      type: TicketType,
      args: {
        id: { type: GraphQLNonNull(GraphQLID) },
      },
      resolve(parent, args) {
        return Ticket.findByIdAndRemove(args.id);
      },
    },


  // Update Ticket
  updateTicket: {
    type: TicketType,
    args: {
      id: { type: GraphQLNonNull(GraphQLID) },
      date: { type: GraphQLString },
      ticketNum: { type: GraphQLString },
      // customerId: { type: GraphQLID },
      material: { type: GraphQLString },
      tareWeight: { type: GraphQLInt },
      grossWeight: { type: GraphQLInt },
      netWeight: { type: GraphQLInt },
      notes: { type: GraphQLString },
    },
    resolve(parent, args) {
      return Ticket.findByIdAndUpdate(
        args.id,
        {
          $set: {
            date: args.date,
            ticketNum: args.ticketNum,
            // customerId: args.customerId,
            material: args.material,
            tareWeight: args.tareWeight,
            grossWeight: args.grossWeight,
            netWeight: args.netWeight,
            notes: args.notes,
          },
        },
        { new: true }
      );
    },
   },
  },
});


module.exports = new GraphQLSchema({
  query: RootQuery,
  mutation
});

Anyone know what I’m doing wrong?

Thanks,

Nate

>Solution :

You have Fields with an uppercase F in Materials, lower case elsewhere.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading