类型 'Promise<GraphQLSchema>' 缺少类型 'GraphQLSchema' 的以下属性

Type 'Promise<GraphQLSchema>' is missing the following properties from type 'GraphQLSchema'

我正在尝试将 Apollo Server 作为打字稿中的云函数启动,并希望在我的 typeDef 中使用 @cypher 和 @relationship 指令。

为了使用这些指令,我使用了 "@neo4j/graphql": "^3.0.0".

我在向 apollo 服务器提供模式时遇到错误。 getSchema() returns 一个 Promise 但 ApollServer 需要一个 GraphQL Schema 类型的模式。

const neoSchema = new Neo4jGraphQL({ typeDefs });

const server = new ApolloServer({
  schema: neoSchema.getSchema(),
  context: ({ req }) => ({
    headers: req.headers,
    req,
  }),
});

exports.handler = server.createHandler();

如果有人能帮助我,我将不胜感激。

Apollo 服务器无法在这一步处理承诺,并且您不能执行 top-level 等待(除非您在 typescript.next),所以您必须将其包装在另一个功能。

危险:不要跳过这一部分

如果您不记住这一点,您将在每次调用时创建一个新的处理程序,这会导致文件描述符泄漏。其症状是您将开始对所有内容(包括 DNS 查找)超时,因此您将开始在代码中出现 ENOTFOUND 错误。我为你们的后代添加了评论:


const neoSchema = new Neo4jGraphQL({ typeDefs });
let _cachedHandler: ReturnType<ApolloServer['createHandler']>;

/**
 * We have to be careful here that we're not creating a new server on EVERY invocation
 * because that will create a file descriptor leak. Make sure you're using a memoized cache
 */
const memoizedHandler = async (event, context) => {
  if (!_cachedHandler) {
    const server = new ApolloServer({
      schema: await neoSchema.getSchema(),
      context: ({ req }) => ({
        headers: req.headers,
        req,
      }),
    });
    // this is the actual handler
    _cachedHandler = server.createHandler();
  }
  // now we can just call the handler
  return _cachedHandler(event, context);
}

exports.handler = memoizedHandler;