将 snake_case 转换为 apollo-server-express 中的 camelCase 字段名称
Convert snake_case to camelCase field names in apollo-server-express
我是 GraphQL 和 Apollo Server 的新手,尽管我已经搜索了文档并 Google 寻找答案。我正在使用 apollo-server-express 从第 3 方 REST API 获取数据。 REST API 对其字段使用 snake_case。是否有简单的方法或 Apollo Server 规范的方法将所有解析的字段名称转换为驼峰式?
我想使用驼峰式大小写来定义我的类型,例如:
type SomeType {
id: ID!
createdTime: String
updatedTime: String
}
但是 REST API returns 对象像:
{
"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 是否有一些功能允许我批量规范化字段名称或覆盖默认字段解析?
我想您可以将 normalizeFields 函数放在 graphql 中间件中,就在 returns 将结果发送到客户端之前。像这样 Graphql Middleware.
中间件是放置逻辑的一个很好的集中位置,因此您无需在每次拥有新的解析器时都添加函数。
@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
})
中的默认字段解析器
如果您使用 Knex.js,我强烈建议您使用 ORM,例如 Objection.js (https://vincit.github.io/objection.js/). An ORM has lots of very useful features that make querying easier in Node.js, including a function called knexSnakeCaseMappers
, which, when passed to the Knex object, will automatically convert snake_case table and column names to camel case before they ever reach your server. Thus your entire server can be written in camel case, matching your GraphQL schema and your client code. Learn more here.
我是 GraphQL 和 Apollo Server 的新手,尽管我已经搜索了文档并 Google 寻找答案。我正在使用 apollo-server-express 从第 3 方 REST API 获取数据。 REST API 对其字段使用 snake_case。是否有简单的方法或 Apollo Server 规范的方法将所有解析的字段名称转换为驼峰式?
我想使用驼峰式大小写来定义我的类型,例如:
type SomeType {
id: ID!
createdTime: String
updatedTime: String
}
但是 REST API returns 对象像:
{
"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 是否有一些功能允许我批量规范化字段名称或覆盖默认字段解析?
我想您可以将 normalizeFields 函数放在 graphql 中间件中,就在 returns 将结果发送到客户端之前。像这样 Graphql Middleware.
中间件是放置逻辑的一个很好的集中位置,因此您无需在每次拥有新的解析器时都添加函数。
@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
})
中的默认字段解析器
如果您使用 Knex.js,我强烈建议您使用 ORM,例如 Objection.js (https://vincit.github.io/objection.js/). An ORM has lots of very useful features that make querying easier in Node.js, including a function called knexSnakeCaseMappers
, which, when passed to the Knex object, will automatically convert snake_case table and column names to camel case before they ever reach your server. Thus your entire server can be written in camel case, matching your GraphQL schema and your client code. Learn more here.