【问题标题】:Cannot import Apollo resolvers无法导入 Apollo 解析器
【发布时间】:2021-10-26 13:19:54
【问题描述】:

我有一个阿波罗查询:

// ./src/resolvers.js

const Movie = {
  id: (parent) => parent.id,
  name: (parent) => parent.name,
  tmdb_id: (parent) => parent.tmdb_id,
};

const Query = {
  movies: () => {
    return prisma.movie.findMany({});
  },
};

在我的仪表板组件中,我试图从 Apollo 返回数据:

// ./src/dashboard.tsx

const DashboardComponent = () => {
  const {loading, error, data} = useQuery(resolvers.Query.movies);

  ...
}

但是 TSlint 显示错误:

TS2345:“() => PrismaPromise”类型的参数不可分配给“DocumentNode |”类型的参数TypedDocumentNode'。 类型 '() => PrismaPromise' 缺少来自类型 'TypedDocumentNode' 的以下属性:种类、定义

我正在使用:

"prisma": "2.30.0",
"typescript": "^4.3.5",
"apollo-client": "^2.6.10",
"apollo-server": "^3.2.0",

【问题讨论】:

    标签: typescript apollo-client apollo-server


    【解决方案1】:

    useQuery() 接受类型为DocumentNodequery 参数。您不能将解析器传递给它。

    DocumentNode:

    gql 解析为 AST 的 GraphQL 查询文档。

    GraphQL 解析器用于解析 GraphQL 模式中定义的字段。实际使用中,一般放在服务器端,搭建一个GraphQL服务器,通过HTTP服务,以Database,REST API为数据源。

    GraphQL解析器放在数据生产端,消费者端通过构造DocumentNodeAST定义需要查询的字段。

    GraphQL 只定义了数据生产端和消费端之间的交换方式,与具体的上层通信协议 HTTP、RPC 等无关。

    Is GraphQL frontend or backend?Does GraphQL use HTTP?

    您应该像这样在客户端创建查询:

    import { gql, useQuery } from '@apollo/client';
    
    const QUERY_MOVIES = gql`
      query QueryMovies {
         movies {
           id
           name
         }
      }
    `
    
    // In React component
    useQuery(QUERY_MOVIES);
    

    【讨论】:

    • 太棒了!您是否知道是否可以像这样在 Apollo 客户端中使用 Prisma?附言。我认为您忘记了答案中的export default QUERY_MOVIES
    • 我是否正确理解解析器不应该在客户端直接使用?解析器的用途是什么?
    • @PeterBoomsma 更新了答案。
    • 顺便说一句,我认为您不需要query QueryMovies() 的参数给我一个错误:GraphQLError: Syntax Error: Expected "$", found ")". 删除() > `query QueryMovies 为我修复了它。
    猜你喜欢
    • 2018-09-22
    • 2021-03-18
    • 1970-01-01
    • 2012-04-04
    • 2013-10-04
    • 1970-01-01
    • 2016-03-12
    • 2018-08-07
    • 2012-11-06
    相关资源
    最近更新 更多