UnhandledPromiseRejectionWarning: 错误:在 ApolloServer 调用 `server.applyMiddleware()` 之前,你必须`await server.start()`

Bol*_*dek 31 error-handling apollo server graphql nestjs

我正在尝试启动我的 nestJs 服务器,它一直给我这个错误:

UnhandledPromiseRejectionWarning:错误:您必须await server.start()在调用server.applyMiddleware() ApolloServer之前

我什至不确定从哪里调试,因为我对 NestJs 和 GraphQL 还是很陌生。

Jay*_*iel 42

这是一个已知的 bug,有一个未解决的问题和一个合并的 PR 来修复它。目前,您可以降级到apollo-server-express@^2


小智 12

对于 Apollo Server Express 3.0 及更高版本,您需要定义一个接受 typeDefs 和解析器参数的异步函数,然后将服务器分配给与之前相同的 Apollo 初始化,如下所示

async function startApolloServer(typeDefs, resolvers){
    const server = new ApolloServer({typeDefs, resolvers})
    const app = express();
    await server.start();
    server.applyMiddleware({app, path: '/graphql'});
    
    app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}${server.graphqlPath}`);
})
}

startApolloServer(typeDefs, resolvers);
Run Code Online (Sandbox Code Playgroud)


eli*_*uil 9

我在升级Ben Awad 的 Graphql-Next-Typeorm[...] 堆栈时遇到了这个问题,只需在服务器启动时添加一个等待即可修复警告

const apolloServer = new ApolloServer({
    introspection: true,
    schema: await buildSchema({
      resolvers: [__dirname + '/resolvers/**/*.js'],
      validate: false
    }),
    context: ({ req, res }) => ({
      req,
      res,
      redis: redisClient
    }),
    formatError
  });


// added this line
  await apolloServer.start();

  apolloServer.applyMiddleware({
    app,
    cors: false
  });
Run Code Online (Sandbox Code Playgroud)


use*_*835 5

完整的工作代码是:

const express = require("express");
const { ApolloServer } = require("apollo-server-express");
const http = require("http");

const app = express();

const typeDefs = `
    type Query{
        totalPosts: Int!
    }
`;
const resolvers = {
    Query: {
        totalPosts: () => 100,
    },
};
let apolloServer = null;
async function startServer() {
    apolloServer = new ApolloServer({
        typeDefs,
        resolvers,
    });
    await apolloServer.start();
    apolloServer.applyMiddleware({ app });
}
startServer();
const httpserver = http.createServer(app);

app.get("/rest", function (req, res) {
    res.json({ data: "api working" });
});

app.listen(4000, function () {
    console.log(`server running on port 4000`);
    console.log(`gql path is ${apolloServer.graphqlPath}`);
});
Run Code Online (Sandbox Code Playgroud)

  • 这无需更改库版本即可工作,但不需要以下行: const httpserver = http.createServer(app); (3认同)

小智 5

降级不是一个选择(至少不再是)

这是解决方案=>

https://javascriptsu.wordpress.com/2021/08/02/apollo-error-must-await-server-start/

const server = new ApolloServer({ typeDefs, resolvers });
const app = express();

server.start().then(res => {
 server.applyMiddleware({ app });
 app.listen({ port: 3000 }, () =>
   console.log("nice")
 )
})
Run Code Online (Sandbox Code Playgroud)