【问题标题】:Convert snake_case to camelCase field names in apollo-server-express在 apollo-server-express 中将 snake_case 转换为 camelCase 字段名称
【发布时间】:2019-05-21 16:56:23
【问题描述】:

我是 GraphQL 和 Apollo Server 的新手,尽管我已经搜索了文档和 Google 以获得答案。我正在使用 apollo-server-express 从第 3 方 REST API 获取数据。 REST API 使用snake_case 作为其字段。有没有简单的方法或 Apollo Server 规范的方法将所有解析的字段名称转换为 camelCase?

我想使用驼峰式大小写来定义我的类型,例如:

type SomeType {
  id: ID!
  createdTime: String
  updatedTime: String
}

但 REST API 返回的对象如下:

{
  "id": "1234"
  "created_time": "2018-12-14T17:57:39+00:00",
  "updated_time": "2018-12-14T17:57:39+00:00",
}

我真的很想避免在解析器中手动规范化字段名称,即

Query: {
    getObjects: () => new Promise((resolve, reject) => {
        apiClient.get('/path/to/resource', (err, response) => {
            if (err) {
                return reject(err)
            }

            resolve(normalizeFields(response.entities))
        })
    })
}

这种方法似乎容易出错,因为我预计解析器的数量会很大。感觉规范化字段名称不应该是解析器的责任。 Apollo Server 是否有一些功能可以让我批量规范化字段名称或覆盖默认字段解析?

【问题讨论】:

    标签: express apollo-server


    【解决方案1】:

    @Webber 提出的解决方案是有效的。

    还可以将 fieldResolver 参数传递给 ApolloServer 构造函数,以覆盖 graphql 包提供的默认字段解析器。

    const snakeCase = require('lodash.snakecase')
    
    const snakeCaseFieldResolver = (source, args, contextValue, info) => {
      return source[snakeCase(info.fieldName)]
    }
    
    const server = new ApolloServer({ 
      fieldResolver: snakeCaseFieldResolver,
      resolvers,
      typeDefs
    })
    

    查看graphql source code中的默认字段解析器

    【讨论】:

      【解决方案2】:

      我想您可以在将结果返回到客户端之前将 normalizeFields 函数放在 graphql 中间件中。类似Graphql Middleware

      中间件是放置逻辑的一个很好的集中位置,因此您无需在每次有新解析器时都添加函数。

      【讨论】:

        【解决方案3】:

        如果您使用的是 Knex.js,我强烈建议您使用 ORM,例如 Objection.js (https://vincit.github.io/objection.js/)。 ORM 有许多非常有用的特性,可以让 Node.js 中的查询变得更容易,包括一个名为 knexSnakeCaseMappers 的函数,当传递给 Knex 对象时,它会在它们到达您的应用程序之前自动将 snake_case 表和列名转换为驼峰式大小写。服务器。因此,您的整个服务器可以用驼峰式编写,匹配您的 GraphQL 模式和客户端代码。了解更多here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-20
          • 2021-01-09
          • 1970-01-01
          • 1970-01-01
          • 2017-11-28
          • 2022-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多