将不带ID的表用于GraphQL服务器进行中继

时间:2019-06-04 10:27:48

标签: graphql relay

我有一个遗留的SQL DB,其中的表没有针对Relay Modern进行优化,因为没有一个表具有属性

  

id

我使用 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

1 个答案:

答案 0 :(得分:0)

尝试用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 }
  })
})

在这里,我们将字段id从传入的GraphQL查询解析到我们的内部字段sid。通常,请检查this tutorial以获得有关GraphQL解析器的更多信息。