首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >graphql中未知对象的架构类型

graphql中未知对象的架构类型
EN

Stack Overflow用户
提问于 2020-03-22 10:07:44
回答 1查看 824关注 0票数 0

我有以下从db返回的对象:

代码语言:javascript
复制
{
  "total_rows": 200,
  "bookmark": "g1AAAABteJzLYWBgYMpgTmEQTM4vTc5ISXIwNDLXMwBCwxyQVCJDUv3___-zMpjc7D8wgEEiCx71eSwgJQ1A6j-GtiwA6MscCg",
  "rows": [
      {
          "id": "51a1ff51b3b4719d05e40ac4bb0d0566",
              "objects": {
                  "0": {
                      "type": "ipv4-addr",
                      "value": "192.168.1.10",
                      "resolves_to_refs": "2"
                  },
                  "1": {
                      "type": "network-traffic"
                  }
        }
  ],
  "counts": {
      "created_by_ref": {
          "0203a7e6-b174-4af9-812d-ab889816e868": 1,
          "0250789a-14c3-4751-b4a0-c017af82b8f1": 1,
          "03c63db6-2a84-4627-88be-a83208d524e6": 1,
          "05cba3da-11ff-4a7a-aae9-0b1614cd5300": 1,
          "fc825d33-26ea-4563-9478-2e1887b87112": 1
      },
      "file.hashes.MD5": {
          "UNDEFINED": 200
      },
      "file.name": {
          "UNDEFINED": 200
      },
      "ipv4_addr.value": {
          "127.0.0.1": 200,
          "192.168.1.10": 200
      },
      "last_observed": {
          "1583503380000": 5,
          "1583589780000": 9,
          "1585749840000": 12
      }
  },
  "num_of_rows": 10
}

我正在尝试将graphql模式应用到上述内容中。我有以下几个可以正常工作的方法:

代码语言:javascript
复制
const graphql = require("graphql");

const { GraphQLObjectType, GraphQLString, GraphQLSchema, GraphQLInt, GraphQLList } = graphql;


const SearchResultType = new GraphQLObjectType({
  name: "SearchResult",
  fields:  ()=>({
    total_rows: { type: GraphQLInt },
    bookmark: { type: GraphQLString },
    //rows: { type: new GraphQLList(GraphQLInt) },
    num_of_rows: { type: GraphQLInt }
  })
});




const RootQuery = new GraphQLObjectType({
  name: "RootQueryType",
  fields: {
    searchResult:{
      type: SearchResultType,
      args: { id: { type: GraphQLString } },
      resolve(parentValue: any, args: any) {
        console.log(args)
        return resultMock;
      }
    }
  }
});

module.exports = new GraphQLSchema({
  query: RootQuery,
});

上述方法适用于已定义的数据类型。但是,在上面的mockResult中有一些对象,例如:

代码语言:javascript
复制
  "objects": {
      "0": {
          "type": "ipv4-addr",
          "value": "192.168.1.10",
          "resolves_to_refs": "2"
      },
      "1": {
          "type": "network-traffic"
      }

代码语言:javascript
复制
  "counts": {
      "created_by_ref": {
          "0203a7e6-b174-4af9-812d-ab889816e868": 1,
          "0250789a-14c3-4751-b4a0-c017af82b8f1": 1,
          "03c63db6-2a84-4627-88be-a83208d524e6": 1,
          "05cba3da-11ff-4a7a-aae9-0b1614cd5300": 1,
          "fc825d33-26ea-4563-9478-2e1887b87112": 1

因此,正如你所看到的,这些对象的键是随机的,或者至少在我们收到它们之前是不可猜测的。我有没有办法这样定义一个东西:GraphQLList:{ type: new type (任何我们不知道的随机对象) },作为下面模式中的一个类型:

代码语言:javascript
复制
const SearchResultType = new GraphQLObjectType({
  name: "SearchResult",
  fields:  ()=>({
    total_rows: { type: GraphQLInt },
    bookmark: { type: GraphQLString },
    rows: { type: new GraphQLList(any random object we do not know ) },
    num_of_rows: { type: GraphQLInt }
  })
});
EN

回答 1

Stack Overflow用户

发布于 2020-03-23 06:40:21

您可以使用GraphQL JSON标量(例如,从这个implementation)。但我并不建议这样做(事实上,几年前我做过一次题为"GraphQL JSON标量被认为有害“的演讲)。相反,您可能希望将类似映射的对象转换为键值对列表。

因此,例如,对于counts对象,您可以执行以下操作:

代码语言:javascript
复制
type CreatedByRef {
  key: ID
  count: Int
}
代码语言:javascript
复制
Object.keys(counts.created_by_ref).map(key => ({
  key,
  count: counts.created_by_ref[key],
}));

这将更改结果的形状,但保留GraphQL的所有属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60795261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档