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

Hus*_*tib 10 javascript node.js graphql apollo-server next.js

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

//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"  });
Run Code Online (Sandbox Code Playgroud)

//解析器

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;
      }
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

//模式

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!
    }`
Run Code Online (Sandbox Code Playgroud)

bri*_*lov 22

这对我有用,是从 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);
});

Run Code Online (Sandbox Code Playgroud)

  • 绝对的摇滚明星!我找这个很久了,谢谢!能否也请链接原始来源? (2认同)

sli*_*wp2 6

如果您正在使用非无服务器框架的集成包(例如express, micro),则必须在创建 , 后立即await调用, ,然后再将其附加到您的 Web 框架并开始接受请求。如果服务器已启动,此assertStarted()方法将断言。更多信息请参见源码注释startApolloServer

有一些例子,请参阅apollo-server-micro包和这个

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' });
});
Run Code Online (Sandbox Code Playgroud)