在apollo-server-express中将snake_case转换为camelCase字段名称

Joe*_*ins 3 express apollo-server

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

我想使用驼峰式的情况来定义我的类型:

type SomeType {
  id: ID!
  createdTime: String
  updatedTime: String
}
Run Code Online (Sandbox Code Playgroud)

但是REST API返回的对象如下:

{
  "id": "1234"
  "created_time": "2018-12-14T17:57:39+00:00",
  "updated_time": "2018-12-14T17:57:39+00:00",
}
Run Code Online (Sandbox Code Playgroud)

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

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

            resolve(normalizeFields(response.entities))
        })
    })
}
Run Code Online (Sandbox Code Playgroud)

鉴于我希望解析器的数量很大,因此这种方法似乎容易出错。还感觉规范化字段名称不应该由解析程序负责。Apollo Server是否有某些功能可以让我批发标准化字段名称或覆盖默认字段分辨率?

Joe*_*ins 5

@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
})
Run Code Online (Sandbox Code Playgroud)

请参阅源代码中的默认字段解析器graphql


Web*_*ber 4

我想你可以在 graphql 中间件将结果返回到客户端之前将它放置在 graphql 中间件中。像Graphql Middleware这样的东西。

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