Ad

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:'[email protected]', 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

Ad

Answer

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: '[email protected]', 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"
        }
      ]
    }
  }
}
Ad
source: stackoverflow.com
Ad