【问题标题】:Using tables without ID field for GraphQL server for Relay将没有 ID 字段的表用于 GraphQL 服务器进行中继
【发布时间】: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

标签: graphql relay


【解决方案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 readygithub.com/mickhansen/graphql-sequelize/blob/master/docs/…。对于 id 我可以使用这个函数id: globalIdField(Staff.sid)
猜你喜欢
  • 2018-02-01
  • 2017-06-24
  • 2021-07-13
  • 2017-04-15
  • 1970-01-01
  • 2016-10-07
  • 2016-05-19
  • 2017-06-03
  • 2020-11-23
相关资源
最近更新 更多