Alex Ironside
Alex Ironside

Reputation: 5059

Finding one element in graphQL by id/email

I'm trying to make a findOneByEmail/id for graphQL. I saw a couple of questions, blog posts, and videos, but they didn't help my case. I know I have to add a filter, but I have to be missing something

Here are my resolvers

const users = [
  {id: 1, email:'[email protected]',password:'zaq1@WSX', pons:[{value:'test'}]},
  {id: 2, email:'[email protected]',password:'ZAQ!2wsx', pons:[{value:'tset'}]}
];
const pons = [{value: 'test'}];
module.exports = {
  Query: {
    users: () => users,
    pons: () => pons,
  }
};

typeDefs

const {gql} = require('apollo-server-express');

module.exports = gql`  
  type Pon {
      value: String!
  }
  type User {
    id: Int
    email: String!
    password: String!
    pons: [Pon]!
  }
  type Query {
      findUser(id: Int): [User]
      users: [User]
      pons: [Pon]
  }
`;

app.js

const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const typeDefs = require('./graphql/typeDefs.js');
const resolvers = require('./graphql/resolvers.js');

const server = new ApolloServer({typeDefs, resolvers});

const app = express();
server.applyMiddleware({ app });

app.listen({ port: 4000 }, () =>
  console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`)
);

I am using express with apollo-server-express.

I tried adding users(id: Int) and users(email: String), but with no success. You can see it in findUser query. I am calling the query like:

query{
  findUser(id: 1) {
    email
    pons {
      value
    }
  }
}

In the GQL playground.

I'd like to able to filter the data on the server, not on the client, and can't find the solution anywhere

Upvotes: 4

Views: 22626

Answers (1)

Lin Du
Lin Du

Reputation: 102467

You can get the id parameters in GraphQL resolver and query user by it.

E.g.

const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const { gql } = require('apollo-server-express');

const users = [
  { id: 1, email: '[email protected]', password: 'zaq1@WSX', pons: [{ value: 'test' }] },
  { id: 2, email: '[email protected]', password: 'ZAQ!2wsx', pons: [{ value: 'tset' }] },
];
const pons = [{ value: 'test' }];

const typeDefs = gql`
  type Pon {
    value: String!
  }
  type User {
    id: Int
    email: String!
    password: String!
    pons: [Pon]!
  }
  type Query {
    findUser(id: Int): User
    users: [User]
    pons: [Pon]
  }
`;

const resolvers = {
  Query: {
    users: () => users,
    pons: () => pons,
    findUser: (_, { id }) => users.find((u) => u.id === id),
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

const app = express();
server.applyMiddleware({ app });

app.listen({ port: 4000 }, () => console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`));

query in GraphQL playground:

query{
  findUser(id: 1){
    email 
    pons {
      value
    }
  }
}

response:

{
  "data": {
    "findUser": {
      "email": "[email protected]",
      "pons": [
        {
          "value": "test"
        }
      ]
    }
  }
}

Upvotes: 5

Related Questions