Next JS api 路由类型为 graphql 错误(解析器不是函数)

Posted

技术标签:

【中文标题】Next JS api 路由类型为 graphql 错误(解析器不是函数)【英文标题】:Next JS api routes with type graphql error (resolver is not a function) 【发布时间】:2020-09-18 04:07:25 【问题描述】:

我想使用 TypeGraphQL 使用 graphql 设置一个新的 Next JS 项目。我认为跳过独立服务器并使用 Next JS 提供的 API 路由是个好主意。 Here 是我受到启发的一个例子。不幸的是,我无法启动并运行 graphql。

下一个 JS 启动时没有错误,但在向 api/graphql 发送请求后立即抛出一个错误

TypeError: resolver is not a function
    at apiResolver (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/api-utils.js:6:7)
    at DevServer.handleApiRequest (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/next-server.js:43:427)
    at async Object.fn (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/next-server.js:35:764)
    at async Router.execute (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/router.js:28:28)
    at async DevServer.run (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/next-server.js:44:494)
    at async DevServer.handleRequest (/home/vavra/Projects/project-united/node_modules/next/dist/next-server/server/next-server.js:13:133)

这是我的文件 src/pages/api/graphql

import  Resolver, Query  from "type-graphql";
import  ApolloServer  from "apollo-server-micro";
import  buildSchema  from "type-graphql";
import "reflect-metadata";

@Resolver()
class HelloResolver 
  @Query(() => String)
  hello() 
    return "hello";
  


export const config = 
  api: 
    bodyParser: false,
  ,
;

export default (async () => 
  const schema = await buildSchema(
    resolvers: [HelloResolver],
  );

  const apolloServer = new ApolloServer( schema );

  return apolloServer.createHandler( path: "/api/graphql" );
)();

有什么帮助吗?

【问题讨论】:

你解决了吗?我也在尝试在 NextJS 应用程序中设置 TypeGraphQL 并遇到同样的问题。我想知道我是否需要破解我的下一个应用程序才能使用 express (bleh)。 @CodeAndCats 不走运,我没有找到任何解决方案,所以我用 Express 运行我的服务器。 【参考方案1】:

here 他们在谈论一个类似的问题,我通过这个表单使用 type-graphql 使用 nextjs。

pages/api/graphql

import 'reflect-metadata';
import  ApolloServer  from 'apollo-server-micro';
import  buildSchema  from 'type-graphql';
import youResolver from '../resolvers/youResolver';
import  NextApiRequest, NextApiResponse  from 'next';

let apolloServerHandler: (req: any, res: any) => Promise<void>;

const getApolloServerHandler = async () => 
  if (!apolloServerHandler) 
    const schema = await buildSchema(
      resolvers: [youResolver],
    );
    apolloServerHandler = new ApolloServer( schema ).createHandler(
      path: '/api/graphql',
    );
  
  return apolloServerHandler;
;

export default async (req: NextApiRequest, res: NextApiResponse) => 
  const apolloServerHandler = await getApolloServerHandler();
  return apolloServerHandler(req, res);
;

export const config =  api:  bodyParser: false  ;

【讨论】:

以上是关于Next JS api 路由类型为 graphql 错误(解析器不是函数)的主要内容,如果未能解决你的问题,请参考以下文章

在开发模式 localhost 中从 Next.js 应用程序请求在不同端口上运行的 Graphql api

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由

Apollo Server + Next.js - GraphQL Schema 未更新

Next.js 路由与子路由的“next-connect”

ReactJS/Next.js:CRA 代理不适用于 Next.js(尝试将 API 请求路由到 Express 服务器)