我想在apollo服务器中添加一个验证层。它应该在每个graphql查询/突变之后,但在解析器函数之前运行。验证层需要知道被调用的graphql查询/突变以及传递的参数。如果无效,它将抛出一个错误,并阻止解析程序函数运行。
我不清楚在没有手动将其放入每个解析器函数的情况下将其注入到哪里。
graphql-tools
实际上包括一个addSchemaLevelResolveFunction
实用程序,它允许您为每个Query
、Mutation
和Subscription
字段包装解析器,以模拟"根级解析器":
const{makeExecutableSchema,addSchemaLevelResolveFunction}=require('graphql-tools'(
const schema = makeExecutableSchema({ resolvers, typeDefs })
const rootLevelResolver = (root, args, context, info) => {
// Your validation logic here. Throwing an error will prevent the wrapped resolver from executing.
// Note: whatever you return here will be passed as the parent value to the wrapped resolver
}
addSchemaLevelResolveFunction(schema, rootLevelResolver)
这是一种将某些逻辑应用于所有根级字段的简单方法,但如果只有某些字段要应用此逻辑,则会有点麻烦。如果是这样,现在您必须维护一个与架构分离的白名单或黑名单字段列表。如果您团队中的其他人正在添加一个新字段,而没有意识到这一机制,这可能会很麻烦。如果您想将相同的逻辑应用于根级别字段之外的字段,这也没有太大帮助。
更好的方法是使用自定义模式指令,如文档中所述。这允许您指示将逻辑应用于哪些字段:
directive @customValidation on FIELD_DEFINITION
type Query {
someField: String @customValidation
someOtherField: String
}
您可以在
context
中添加验证方法,在那里您还可以获得请求参数、查询、标头等您还可以考虑实现可以应用于模式级别的自定义指令。
参考https://www.apollographql.com/docs/apollo-server/features/authentication.html