错误:在 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】:如果您将集成包用于非无服务器
框架(如express
、micro
),您必须在创建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 服务器端 api 调用返回 500 内部服务器错误
错误:在 next.js 中找不到模块“swiper/react”