Apollo-server 2验证中间件

时间:2018-12-18 17:46:21

标签: javascript graphql apollo-server

我想向apollo服务器添加一个验证层。 它应该在每个graphql查询/变异之后但在解析器功能之前运行。验证层将需要知道被调用的graphql查询/变异以及传递的参数。如果无效,将抛出错误,并阻止解析器功能运行。

我不清楚在不手动将其放入每个解析器功能的情况下将其注入到哪里。

2 个答案:

答案 0 :(得分:2)

graphql-tools实际上包含一个addSchemaLevelResolveFunction实用程序,使您可以为每个QueryMutationSubscription字段包装解析器,以模拟“根级别”。解析器”:

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)

这是将逻辑应用于所有根级字段的一种简单方法,但是如果您只想将此逻辑应用于一些字段,则会有些麻烦。如果是这样,现在您必须维护一个白名单或黑名单字段的列表,与您的架构分开。如果您团队中的其他人正在添加新字段并且不了解此机制,则可能会很麻烦。如果您想将相同的逻辑应用于根级字段之外的字段,也并非完全有用。

更好的方法是利用自定义架构指令as outlined in the docs。这使您可以指示将逻辑应用于哪些字段:

directive @customValidation on FIELD_DEFINITION

type Query {
  someField: String @customValidation
  someOtherField: String
}

答案 1 :(得分:0)

  

您可以在context内添加验证方法,在那里您还可以获取请求参数,查询,标头等

     

您还可以考虑实现可在架构级别应用的自定义指令。

     

ref https://www.apollographql.com/docs/apollo-server/features/authentication.html