GraphQL:包装外部API没有结果

时间:2018-09-06 10:19:25

标签: javascript api graphql

我正在尝试使用grahql服务器包装外部api。 如果我在外部api上调用以下端点:https://api.goingelectric.de/chargepoints/?key=secret&lat=49.5543&lng=11.0257&radius=5&ge_id=900

我收到正确的结果:

{
"status": "ok",
"chargelocations": [
    {
        "ge_id": 900,
        "name": "Rathausplatz",
        "address": {
            "city": "Erlangen",
            "country": "Deutschland",
            "postcode": "91052",
            "street": "Schuhstraße 44"
        },
        "coordinates": {
            "lat": 49.591301,
            "lng": 11.0087
        },
        "chargepoints": [
            {
                "count": 2,
                "power": 22,
                "type": "Typ2"
            }
        ]
    }
]
}

但是,如果尝试使用graphql调用此端点,则总是收到null 这是我的schema.js:

<script src="https://gist.github.com/FlonTaut/bc1bf5f653ff737b7db78aaabc0ce52a.js"></script>

它与端点的调用完全相同,但是没有收到应答。 我需要将我的json.station重命名为json.chargepoints还是答案status: ok遇到了麻烦,我需要以某种方式忽略它?

我可以添加稍后运行查询的方式,但只是

station(lat:...,lng:...) {
 name
 address {
   city
   street
}

例如具有相同的坐标 如果我错过任何需要的信息,请告诉我

已经感谢

编辑:现在我尝试了一些,现在遇到了另一个问题。 那就是我当前的StationType,所以是个漏洞:

const StationType = new GraphQLObjectType({
name: "Station",
description: "...",

fields: {
    name : { 
        type: GraphQLString,
        description: "Name of the Station",
        resolve: (parent, args, context) => {
            return parent.name;
        }
    },
    address: {
        type: new GraphQLObjectType(AdressType)
    },
    coordinates: {
        type: new GraphQLObjectType(CoordType)
    }

}

})

这是我的CoordType,其中包含坐标: `const CoordType = new GraphQLObjectType({     名称:“ Coodinates”,     描述:“包含充电点的经度和纬度的对象”,

fields: () => ({
    lat: { 
        type: GraphQLString, 
        description: "Latitude Coordinates of the Chargepoint",
        resolve: (parent, args, context) => {
            return parent.coordinates.lat;
        }
    },
    lng: {
        type: GraphQLString,
        description: "Longtitude Coordinates of the Chargepoint",
        resolve: (parent, args, context) => {
            return parent.coordinates.lng;
        }
    }
})
})

但是我知道在打开GraphiQL时收到以下错误: Type Coodinates must define one or more fields."与AdressType相同。那么问题出在哪里呢? CoordType恰好定义了两个字段。

1 个答案:

答案 0 :(得分:1)

您需要返回您的决心。现在,您只需拨打网络电话,结果什么都没有。

您有:

False

您需要:

resolve: (root, args) => {
  getStationsByURL(`lat=${args.lat}&lng=${args.lng}&radius=5`)
}

Javascript中的默认返回值为resolve: (root, args) => { return <network call + any data access inside of it that's needed> } ,graphql会将解析器返回的undefined转换为undefined

更新:基于以下评论中的对话:

假设从您的JSON响应返回的对象如下:

null

然后您的graphql类型定义可能类似于:

{
  data: {
    bar: 1337,
    foo: 'Hi',
  }
}

请注意,GraphQL提供了默认解析器。因此,例如,如果您的API调用返回的数据如下:

const MyType = new GraphQLObjectType({
  name: 'MyType',
  fields: {
    bar: {
      type: GraphQLInt,
      resolve: (parent, args, context) => {
        return parent.data.bar;
      },
    },
    foo: {
      type: GraphQLString,
      resolve: (parent, args, context) => {
        return parent.data.foo;
      }
    },
  },
});

然后,您无需提供任何解析程序。默认解析器使用该字段的名称,并尝试在父对象中找到相同的名称。