通过 id/email 在 graphQL 中查找一个元素

Posted

技术标签:

【中文标题】通过 id/email 在 graphQL 中查找一个元素【英文标题】:Finding one element in graphQL by id/email 【发布时间】:2020-08-03 23:19:51 【问题描述】:

我正在尝试为 graphQL 创建一个 findOneByEmail/id。我看到了一些问题、博客文章和视频,但它们对我的情况没有帮助。我知道我必须添加一个过滤器,但我必须遗漏一些东西

这是我的resolvers

const users = [
  id: 1, email:'a@a.a',password:'zaq1@WSX', pons:[value:'test'],
  id: 2, email:'b@b.b',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`)
);

我正在使用 expressapollo-server-express

我尝试添加users(id: Int)users(email: String),但没有成功。您可以在findUser 查询中看到它。我正在调用这样的查询:

query
  findUser(id: 1) 
    email
    pons 
      value
    
  

在 GQL 操场上。

我希望能够在服务器上过滤数据,而不是在客户端上,并且在任何地方都找不到解决方案

【问题讨论】:

apollographql.com/docs/apollo-server/data/resolvers/… 【参考方案1】:

您可以在GraphQL解析器中获取id参数并通过它查询用户。

例如

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

const users = [
   id: 1, email: 'a@a.a', password: 'zaq1@WSX', pons: [ value: 'test' ] ,
   id: 2, email: 'b@b.b', 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`));

在 GraphQL 游乐场中查询:

query
  findUser(id: 1)
    email 
    pons 
      value
    
  

回复:


  "data": 
    "findUser": 
      "email": "a@a.a",
      "pons": [
        
          "value": "test"
        
      ]
    
  

【讨论】:

这是findUser查询中的_ @AlexIronside 解析器的第二个参数,id 好的,我只需要在解析器中添加查找和比较? @AlexIronside 对于现实世界,您应该使用id 参数从数据库中找到用户。但是对于这个例子,我们有一个内存数据库users。所以,是的,你只需要从这个 users 数组中找到用户。

以上是关于通过 id/email 在 graphQL 中查找一个元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 GraphQL 代码生成器从解析器返回不完整的形状

在 Apollo 中查找缺失的 GraphQL 解析器

用户连接到另一个用户作为朋友关系 - AWS GraphQL 转换

Graphene/GraphQL 查找特定列值

在 React 组件中的多个 GraphQL 查询之间进行更改

GraphQL 查询中的多项查找