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

时间:2018-12-21 07:54:55

标签: express apollo-server

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

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

#include<iostream> 
using namespace std; 

class Test 
{ 
  private: 
  int x; 
  public: 
  Test(int x = 0) { this->x = x; } 
  void change(Test *t)
  { 
    this = t; //line 1 
  } 
  void print() { cout << "x = " << x << endl; } 
}; 

int main() 
{ 
  Test obj(5); 
  Test *ptr = new Test (10); 
  obj.change(ptr); 
  obj.print(); 
  return 0; 
} 

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

@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

中的默认字段解析器

答案 1 :(得分:1)

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

中间件将是放置逻辑的理想集中位置,因此您不必在每次拥有新的解析器时都添加功能。

答案 2 :(得分:0)

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