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 正常工作?
无论您直接使用makeExecutableSchema还是将typeDefsand传递resolvers给ApolloServer构造函数都不重要——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 尝试自省模式时,它无法在内省结果中找到自定义标量并出错。我会避免使用那个特定的库——它看起来并没有得到积极维护。
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |