错误:在 next.js 中调用 `server.createHandler()` 之前必须`await server.start()`

Posted

技术标签:

【中文标题】错误:在 next.js 中调用 `server.createHandler()` 之前必须`await server.start()`【英文标题】:Error: You must `await server.start()` before calling `server.createHandler()` in next.js 【发布时间】:2021-11-01 04:34:21 【问题描述】:

我在尝试检查 apollo graphql 是否工作正常时收到此错误。 错误:在调用server.createHandler() 之前必须先await server.start() 注意:有一个类似的问题,但我没有使用快递Error: You must `await server.start()` before calling `server.applyMiddleware()`

//api/graphql.js

  import    ApolloServer    from  "apollo-server-micro";

import    resolvers    from  "../../apis/resolver";
import    typeDefs    from  "../../apis/schemas";

const  apolloServer  =  new  ApolloServer(  typeDefs,  resolvers  );

export  const  config  =  
    api:  
        bodyParser:  false
    
;

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

//解析器

import axios from "axios";

export const resolvers = 
  Query: 
    getUsers: async () => 
      try 
        const users = await axios.get("https://api.github.com/users");
        return users.data.map(( id, login, avatar_url ) => (
          id,
          login,
          avatar_url
        ));
       catch (error) 
        throw error;
      
    ,
    getUser: async (_, args) => 
      try 
        const user = await axios.get(
          `https://api.github.com/users/$args.name`
        );
        return 
          id: user.data.id,
          login: user.data.login,
          avatar_url: user.data.avatar_url
        ;
       catch (error) 
        throw error;
      
    
  
;

//模式

import    gql    from  "apollo-server-micro"; 

export  const  typeDefs  =  gql`
    type  User 
        id: ID
        login: String
        avatar_url: String
    

    type  Query 
        getUsers: [User]
        getUser(name: String!): User!
    `

【问题讨论】:

【参考方案1】:

这对我有用,是从 prisma 的人那里抄来的。

import Cors from "micro-cors";
import schema from "graphql/schema";
import  ApolloServer  from "apollo-server-micro";
import  PageConfig  from "next";
import  createContext  from "graphql/context";

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

const cors = Cors();

const server = new ApolloServer(
  context: createContext,
  schema,
);

const startServer = server.start();

export default cors(async (req, res) => 
  if (req.method === "OPTIONS") 
    res.end();
    return false;
  

  await startServer;
  await server.createHandler( path: "/api/graphql" )(req, res);
);

【讨论】:

绝对的摇滚明星!找这个很久了,谢谢!能否请您也链接原始来源? @JanRichter 很高兴我能提供帮助。来源:youtu.be/RJpevpbC4YY?t=323【参考方案2】:

我有同样的问题。这是一个带有未解决问题的已知错误,因此现在您可以降级 apollo-server-micro@^2。

我的 package.json 现在如下所示,并且可以完美运行。

"dependencies": 
  "apollo-server-micro": "2.25.0",
  "graphql": "^15.6.1",
  "micro": "^9.3.4",
  "mongoose": "^6.0.10",
  "next": "11.1.2",
  "react": "17.0.2",
  "react-dom": "17.0.2" 

【讨论】:

【参考方案3】:

如果您将集成包用于非无服务器 框架(如expressmicro),您必须在创建ApolloServer 之后立即await 调用start,然后再将其附加到您的Web 框架并开始接受请求。这个assertStarted() 方法将断言服务器是否已启动。欲了解更多信息,请参阅comments of source code

有一些例子,见apollo-server-micro包和this

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

const typeDefs = gql`
  type Query 
    sayHello: String
  
`;

const resolvers = 
  Query: 
    sayHello(parent, args, context) 
      return 'Hello World!';
    ,
  ,
;

const apolloServer = new ApolloServer( typeDefs, resolvers );
module.exports = apolloServer.start().then(() => 
  return apolloServer.createHandler( path: '/data' );
);

【讨论】:

以上是关于错误:在 next.js 中调用 `server.createHandler()` 之前必须`await server.start()`的主要内容,如果未能解决你的问题,请参考以下文章

Next JS 中的页面预渲染发生错误 [重复]

Next.js 服务器端 api 调用返回 500 内部服务器错误

错误:在 next.js 中找不到模块“swiper/react”

如何使用 Next.js 检查自定义服务器中是不是存在页面

如何修复 axios Next js 中的“错误:请求失败,状态码为 404”

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