我正在尝试启动我的 nestJs 服务器,但它一直给我这个错误:
UnhandledPromiseRejectionWarning:错误:您必须在调用 await server.start()
之前server.applyMiddleware()
在 ApolloServer
我什至不知道从哪里调试,因为我对 NestJs 和 GraphQL 还很陌生。
答案 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