将没有 ID 字段的表用于 GraphQL 服务器进行中继
Posted
技术标签:
【中文标题】将没有 ID 字段的表用于 GraphQL 服务器进行中继【英文标题】:Using tables without ID field for GraphQL server for Relay 【发布时间】:2019-10-19 21:00:22 【问题描述】:我有一个旧版 SQL 数据库,其中包含未针对 Relay Modern 优化的表,因为这些表都没有属性
身份证
我使用 Sequelize 作为 ORM,express-graphql 作为 GraphQl 层。
序列化层:
const STAFF = sequelize.define('staff',
sid:
// set the primary key for the table
primaryKey: true,
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
unique: true
,
firstName:
type: Sequelize.STRING,
allowNull: false
GraphQl 层:
const StaffType = new GraphQLObjectType(
name: 'Staff',
description: 'This is the GraphQl schema for the staff table',
fields: () => (
sid: type: GraphQLInt ,
firstName: type: GraphQLString
)
)
如您所见,此表有一个唯一键 sid。
我想知道是否有办法为服务器上的不同唯一键创建别名,以便我可以在客户端使用 Relay Modern 并可以编写如下查询:
node(id: "4")
id
... on Staff
firstName
这是 Relay 不得不说的字段:
Relay 对对象识别的支持依赖于 GraphQL 服务器以标准化的方式公开对象标识符。在查询中,模式应该提供一个标准的机制来通过 ID 请求一个对象。在响应中,架构提供了提供这些 ID 的标准方式。
https://facebook.github.io/relay/graphql/objectidentification.htm
【问题讨论】:
确定服务器的 GraphQL 架构的代码在哪里?在那里,您应该能够声明字段id
,它在内部解析为sid
。
我添加了 Sequelize 层。 sid
是实际唯一的主键,不能改成id
。
【参考方案1】:
改用StaffType
试试这个:
const StaffType = new GraphQLObjectType(
name: 'Staff',
description: 'This is the GraphQl schema for the staff table',
fields: () => (
id:
type: GraphQLID,
resolve: (parent, args, ctx) => parent.sid
,
firstName: type: GraphQLString
)
)
在这里,我们将来自传入 GraphQL 查询的字段 id
解析为我们的内部字段 sid
。查看this tutorial,了解有关 GraphQL 解析器的更多信息。
【讨论】:
嗨 Nilan,是的,这可能有效,但这不是我发现的 Relay 做事方式。我可能找到了解决方案,但我仍然需要对其进行测试。 此代码用于后端,独立于 Relay。 Relay 可以看到的所有类型都是StaffType
类型,它需要一个字段id
。所以,说“这不是 Relay 的做事方式”是令人惊讶的,我认为是错误的。是什么让你这么说?
顺便说一句,如果我正确阅读了the Relay spec,我们需要id
类型的ID
字段而不是Int
,我相应地更改了我的答案。
目前我正在测试这个包graphql-sequelize
。有一个解释如何使它成为Relay ready
。 github.com/mickhansen/graphql-sequelize/blob/master/docs/…。对于 id 我可以使用这个函数id: globalIdField(Staff.sid)
以上是关于将没有 ID 字段的表用于 GraphQL 服务器进行中继的主要内容,如果未能解决你的问题,请参考以下文章