如何在Apollo GraphQL Server中连接两个REST数据源



我正在尝试将来自Apollo GraphQL Server中两个不同数据源的响应连接起来。基本上,我正在尝试加入谷歌附近搜索API和谷歌地点详细信息API的回复。

以下是我的代码:

const { ApolloServer, gql } = require('apollo-server');
const { NearbySearchAPI } = require('./NearbySearchAPI');
const { PlaceDetailsAPI } = require('./PlaceDetailsAPI');
const typeDefs = gql`
type Place {
name: String,
place_id: String,
rating: Float,
user_ratings_total: Int,
place_detail: PlaceDetail
} 
type PlaceDetail {
formatted_address: String,
formatted_phone_number: String,
international_phone_number: String,
website: String
}
type Query {
nearbyPlaces(location: String, radius: Int, type: String): [Place],
placeDetail(place_id: String): PlaceDetail
}
`;

const resolvers = {
Query: {
nearbyPlaces: async (parent, {location, radius, type}, { dataSources }) => {
let response =  dataSources.nearbySearchAPI.getNearbyPlaces(location, radius, type);
return response.then(data => data.results);
},
placeDetail: async (parent, {place_id}, {dataSources}) => {
let response = dataSources.placeDetailAPI.getPlaceDetail(place_id);
return response.then(data => data.result);
} 
},
};
const server = new ApolloServer({ 
typeDefs, 
resolvers,
dataSources: () => {
return {
nearbySearchAPI: new NearbySearchAPI(),
placeDetailAPI: new PlaceDetailsAPI()
}
}, 
context: () => {
return {
key: 'AIzaSXXXXXXXXXtzb_XvrBQh4I',
};
},
});
server.listen().then(({ url }) => {
console.log(`🚀  Server ready at ${url}`);
});

我在Place类型中嵌入了PlaceDetail类型。这两个查询都单独给出了正确的响应,但当我执行嵌套查询时,我总是将PlaceDetail设置为null。

{
nearbyPlaces(location:"-1.259733, 36.815877", radius: 2000, type: "restaurant"){
place_id,
name,
rating,
user_ratings_total,
place_detail {
formatted_address,
formatted_phone_number,
international_phone_number,
website
}
}
}

知道问题在哪里吗?

查询解析器的格式正确,可以返回其根属性Query.nearbyPlacesQuery.placesDetail

然而,Query.nearbyplaces.placesDetails期望返回Place类型,并且由于Place.placeDetail没有解析程序,因此返回null。

您需要为type Place定义一个新的根解析程序,如下所示:

const resolvers = {
Query: {
...QueryResolvers
},
Place: {
placeDetail: async (root, args, { dataSources }) {

// parent.place_id is the place_id property of each item to return  
let response = dataSources.placeDetailAPI.getPlaceDetail(parent.place_id);
return response.then(data => data.result);
}
}
}

最新更新