微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

解决方法

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

,

我在升级 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
  });
,

完整的工作代码是:

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

您可以将所有内容放在异步函数中并在您的服务器(应用程序、索引...).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();
,

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

,

在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。