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

时间:2021-07-12 22:57:33

标签: error-handling server graphql nestjs apollo

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

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

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

6 个答案:

答案 0 :(得分:32)

这是一个已知错误,存在未决问题 and a merged PR to fix it。目前,您可以降级到 apollo-server-express@^2

答案 1 :(得分:4)

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

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
  });

答案 2 :(得分:4)

完整的工作代码是:

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}`);
});

答案 3 :(得分:2)

您可以将所有内容放在异步函数中并在您的服务器(应用程序、索引...).js 中执行该函数。您还可以检查 npm 包。 https://www.npmjs.com/package/apollo-server-express 例如:

const express = require('express')
    , http = require('http')
    , path = require('path');
const { ApolloServer } = require('apollo-server-express');

async function startExpressApolloServer() {

    const { typeDefs } = require('./graphql/schemas/schema');
    const { resolvers } = require('./graphql/resolvers/resolver');

    const server = new ApolloServer({ typeDefs, resolvers });
    await server.start();

    const app = express();
    
    server.applyMiddleware({ app, path: '/api/graphql' });

    await new Promise(resolve => app.listen({ port: 3001 }, resolve));
    console.log(`Server ready at http://localhost:3001${server.graphqlPath}`);
    return { server, app };
}

startExpressApolloServer();

答案 4 :(得分:0)

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

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);

答案 5 :(得分:-1)

在 v3 中,如果您使用 apollo-server-express,则需要启动函数 https://www.apollographql.com/docs/apollo-server/api/apollo-server/#start

你可以这样做。

const app = express()
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
....
export const startup = async () => {
  await server.start()
  server.applyMiddleware({ app, path: `/api/${configs.region}/graphql` })
  return app
}

// call startup in another file to get app