Apollo graphql:makeExecutableSchema 和游乐场

dio*_*lla 2 graphql apollo-server prisma

我是一个初学者,尝试使用 apollo-express 和 prisma 设置 graphql API

一切都很顺利,但我决定使用这个库来添加输入验证: graphql-constraint-directive

它要求我使用 makeExecutableSchema 来构建我的架构,以便我可以使用schemaDirectives参数

我启动服务器的代码是这样的:

const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({req}) => {
        const userId = getUserID(req);

        return {
            userId,
            prisma
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

一切都很顺利

但为了使用该库,我将其重构如下:

const schema = makeExecutableSchema({
    typeDefs,
    resolvers,
    schemaDirectives: {constraint: ConstraintDirective}
});
const server = new ApolloServer({
    schema,
    context: ({req}) => {
        const userId = getUserID(req);

        return {
            userId,
            prisma
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

它也有效,我所有的查询和突变都有效,验证也有效。

但它破坏了 graphql-playground:它不再能够加载我的架构和文档,两个选项卡都是空的。它显示以下错误: 无法访问服务器

它仍然有效:我能够发送我的查询和突变等,但我不再有代码完成和自动文档,因为它知道我的模式,因此不再有用

如果我替换纯 typeDefs 和解析器的可执行模式,那么它会再次正常工作,playground 会再次加载所有内容

使用 makeExecutableSchema 时我是否应该做一些不同的事情,以使 Playground 正常工作?

Dan*_*den 5

无论您直接使用makeExecutableSchema还是将typeDefsand传递resolversApolloServer构造函数都不重要——makeExecutableSchema无论如何,Apollo Server 在幕后使用。事实上,您可以直接将指令映射传递给构造函数:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  schemaDirectives: {constraint: ConstraintDirective}
  context: ({req}) => {
    const userId = getUserID(req);

    return {
      userId,
      prisma
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

这是您正在使用的库的错误。该指令将内置标量替换为自定义标量,但实际上并未将这些自定义标量添加到架构中。当 Playground 尝试自省模式时,它无法在内省结果中找到自定义标量并出错。我会避免使用那个特定的库——它看起来并没有得到积极维护。