【问题标题】:Apollo server, GraphQL and Sequelize - how to put raw data into a GraphQL Schema ResponseApollo 服务器、GraphQL 和 Sequelize - 如何将原始数据放入 GraphQL Schema 响应中
【发布时间】:2021-06-24 03:06:17
【问题描述】:

在网上搜索了一个具体示例后,我认输并寻求帮助。

我正在使用 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], [ColumnDef] ]
  },
  { affectedRows: 6, insertId: 0, warningStatus: 0 }
]

【问题讨论】:

  • 从数据库返回什么(形状)? ...如何(查看 grqphql 类型)[你认为]响应(形状)应该是什么样子?
  • 形状是一个基本记录集,二维数组,其中每条记录与我给出的示例中的模式 fooSchemaForBothTables 匹配。
  • console.log(result) ?
  • 我将结果的输出添加到我原来的问题中。

标签: stored-procedures graphql sequelize.js apollo


【解决方案1】:

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

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

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

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

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

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

您还可以搜索一些更可靠的 sequelize(暂时不用 graphql)教程,其中包含“更有效”的模型映射。

下一步?

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

【讨论】:

  • 通过你的 cmets 工作。关于我为什么以这种方式做事的问题,我的大部分回答是因为我还没有看到一个好的例子,或者我理解的例子,所以我正在尝试不同的事情。他们可能是做一些简单的事情的漫长道路。感谢您的帮助,一旦我开始工作,我会更新它。
  • 我发现的东西对我有用。它可能不适用于其他场景。我的存储过程有一些开销,或者可以,所以当它运行时,它会将结果存储到一个扁平的“缓存”表中。我所做的是为缓存表创建一个 sequelize 模型,当我得到结果并使用 sequelize 模型 build() 将每个记录填充到其中并将其推送到一个数组中时,这就是输出。效果很好。如果有人需要更多帮助,请发表评论,我会尽力解释得更好。
猜你喜欢
  • 2018-09-07
  • 2017-07-19
  • 2018-12-08
  • 2019-08-20
  • 2019-07-15
  • 2020-12-02
  • 2017-11-07
  • 2019-03-10
  • 2018-03-05
相关资源
最近更新 更多