Serafim
Serafim

Reputation: 485

Backend with Express(JS) - GraphQL mutation function doesn't work

I don't get the request variable in the mutation GraphQL on the backend. I don't understand why it doesn't work. I get the next error: "Cannot destructure property 'name' of 'undefined' as it is undefined."

That mutation I make in Apollo Studio:

mutation Mutation($createOwnerName: String) {
  createOwner(name: $createOwnerName)
}

My variables in Apollo Studio:

{
  "createOwnerName": "John"
}

enter image description here

My backend with Express schema.js:

const { buildSchema } = require("graphql");
const schema = buildSchema(`
 type Mutation {
    createOwner(name: String): String
  }
`);

module.exports = schema;

resolvers.js:

const resolvers = {
 Mutation: {
  createOwner: ({name}) => {
      console.log('createOwner name', name)
      return name
  }
 }
}

server.js:

const { createServer } = require("http");
const express = require("express");
const { execute, subscribe } = require("graphql");
const { ApolloServer } = require("apollo-server-express");
const { SubscriptionServer } = require("subscriptions-transport-ws");
const { makeExecutableSchema } = require("@graphql-tools/schema");
const typeDefs = require("./graphql/schema.js");
const resolvers = require("./graphql/resolvers.js");
require("dotenv").config();
const mongoose = require("mongoose");

// mongoose
mongoose
  .connect(process.env.DB_HOST, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => console.log("MongoDB connected"))
  .catch((err) => console.log(err));

(async () => {
  const PORT = 3033;
  const app = express();
  const httpServer = createServer(app);

  app.get("/rest", function (req, res) {
    return res.json({ data: "rest" });
  });

  const schema = makeExecutableSchema({ typeDefs, resolvers });

  const server = new ApolloServer({
    schema,
  });
  await server.start();
  server.applyMiddleware({ app });

  SubscriptionServer.create(
    { schema, execute, subscribe },
    { server: httpServer, path: server.graphqlPath }
  );

  httpServer.listen(PORT, () => {
    console.log(
      `🚀 Query endpoint ready at http://localhost:${PORT}${server.graphqlPath}`
    );
    console.log(
      `🚀 Subscription endpoint ready at ws://localhost:${PORT}${server.graphqlPath}`
    );
  });
})();

Upvotes: 0

Views: 212

Answers (1)

Herku
Herku

Reputation: 7666

You are destructuring the wrong argument. Arguments are in that order:

  • Parent value
  • Argument values
  • Context
  • GraphQL Resolve Info

Destructure the second parameter:

const resolvers = {
 Mutation: {
  createOwner: (parent, {name}) => {
      console.log('createOwner name', name)
      return name
  }
 }
}

Upvotes: 1

Related Questions