簡體   English   中英

Apollo GraphQL:擴展而不是覆蓋默認解析器行為

[英]Apollo GraphQL: Augment instead of overriding default resolver behaviour

在Apollo Server文檔中,它描述了默認解析器的行為,這非常方便。

我還從其他地方(如果還記得,還有另一個SO問題)收集到了,您可以通過將fieldResolver函數傳遞給apollo-server實例的選項來覆蓋自己的默認resolver函數:

const server = new ApolloServer({ typeDefs, resolvers,
  fieldResolver: function (source, args, context, info) {
    console.log("Field resolver triggered!")
    return null;
  }
});

我想做的是增加默認行為,而不是覆蓋默認行為。 具體來說,我正在與一個REST API集成,該API將返回snake_case中的字段,而我的架構正嘗試遵循使用camelCase作為字段名稱的建議約定。 我想將此字段名稱轉換包裝在默認解析器行為的周圍,而不必重新編寫。

另外,如果有人可以將我指向默認解析器實現的源位置,我很樂意接受它並對其進行調整!

可通過graphql模塊獲得默認解析器:

const { defaultFieldResolver } = require('graphql')

但是,可以將字段從蛇格轉換為駝峰格,而無需調用默認解析器:

someField: (parent) => parent.some_field

如果要創建可重用的解析器功能,可以執行以下操作:

const camelCaseResolver = (parent, args, ctx, info) => {
  return parent[_.snakeCase(info.fieldName)]
}

或者更好的是,將邏輯提取到schema指令中

class SnakeCaseDirective extends SchemaDirectiveVisitor {
  visitFieldDefinition(field) {
    field.resolve = async function (parent, args, ctx, info) {
      return parent[_.snakeCase(info.fieldName)]
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM