Apollo 服务器、GraphQL 和 Sequelize - 如何将原始数据放入 GraphQL 模式响应

问题描述

在互联网上搜索特定示例后,我认输并寻求帮助。

我正在使用 Apollo 服务器、GraphQL 和 Sequelize,并且我正在调用返回从两个不同表创建的记录集的存储过程。我正在取回数据,但我不知道如何将结果放入 GraphQL 架构响应中。

这是我的解析器中的代码

async functionName(_,{input},{user = null}) {
    if (!user) {
        throw new AuthenticationError('You must login to use this function');
    }
    const {record_id} = input;
    const result = await DBService.query(
        'Call sp_JoinTwoTables_Select(:id)',{
            model: FooModel,mapToModel: true,raw: true,replacements: {id: record_id},type: QueryTypes.SELECT
        }
    );
    console.log('functionName.result');
    console.log(result); // Getting results
    return result;
}

这是我的架构中的代码

const {gql} = require('apollo-server-express');

module.exports = gql`
    type Foo {
        id: Int!
        foo_name: String!
        date_created: String!
        date_modified: String!
    }

    extend type Mutation {
        functionName(input: fooInput!): fooResponse!
    }

    input fooInput {
        id: Int!
    }

    type fooResponse {
        tree: [fooSchemaForBothTables!]
    }
    type fooSchemaForBothTables {
        id: Int!
        foo_name: String!
        column_from_second_table: Int!
    }
`;

由于数据库中没有表,所以我创建了一个简单的对象。当失败时,我尝试了一个续集的模型对象,但这也失败了。这是这段代码

module.exports = {FooModel: {
    id: 0,fooName: '',column_from_second_table: 0
}};

我得到的输出是(不是我想象的二维数组):

Executing (default): Call sp_CommunityHierarchy_Select(9)
selectHierarchyTree.result
[
  {
    '0': {
      community_id: 1,community_name: 'Cars',level_from_apex: null,parent_id: null
    },'1': {
      community_id: 8,community_name: 'Chevy',level_from_apex: 2,parent_id: 1
    },'2': {
      community_id: 9,community_name: 'Suburban',level_from_apex: 3,parent_id: 8
    },Meta: [ [ColumnDef],[ColumnDef],[ColumnDef] ]
  },{ affectedRows: 6,insertId: 0,warningStatus: 0 }
]

解决方法

您的“原始”数据库结果:

  • 是一个数组;
  • 第一个元素是一个对象,其记录/项目编码为索引命名的属性;

您需要的变更(为什么不是查询类型!?)响应应该是 tree: [fooSchemaForBothTables!] - 具有 tree 命名属性的对象(真的需要额外的嵌套级别?),带有 fooSchemaForBothTables- 数组形状对象作为值:

{
  tree: [
    {
      id: 1,foo_name: 'Cars`,column_from_second_table: 'whatever`,},{
      id: 2,foo_name: 'Chevy`,}
  ]
}

您的工作是将 DB 响应转换为所需的变异结果形状。

提示:您可以在辅助项目(codesandbox)中对此 DB 结果(一些输入常量)进行硬编码,并编写一些转换 fn。准备好后在这个解析器中使用它。

您还可以搜索一些更可靠的sequelize(暂时不理会graphql)具有“更有效”模型映射的教程。

下一步?

如果它是一棵树,那么为什么不将其作为树结构返回 - 嵌套节点/类型?