假设我有2个扩展RESTDataSource的API类。
class MoviesAPI extends RESTDataSource {
async getMovies() {}
}
class SongsAPI extends RESTDataSource {
async getSongs() {}
}
我怎么能调用 getSongs
从 getMovies
在现有的Apollo服务器上下文中?
你可以通过以下方式获得apollo服务器的上下文。this.context
中的数据源类,并获得 dataSources
通过 this.context.dataSources
.
例如:
server.ts
:
import { ApolloServer, gql } from 'apollo-server';
import { MoviesAPI } from './MoviesAPI';
import { SongsAPI } from './SongsAPI';
const typeDefs = gql`
type Query {
movies: String
}
`;
const resolvers = {
Query: {
movies: (_, __, { dataSources }) => {
return dataSources.moviesAPI.getMovies();
},
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
dataSources: () => {
return {
moviesAPI: new MoviesAPI(),
songsAPI: new SongsAPI(),
};
},
});
server.listen().then(({ url }) => {
console.log(`Apollo server is listening on ${url}`);
});
MoviesAPI.ts
:
import { RESTDataSource } from 'apollo-datasource-rest';
export class MoviesAPI extends RESTDataSource {
async getMovies() {
const songs = await this.context.dataSources.songsAPI.getSongs();
const movies = ['a', 'b'];
return JSON.stringify({ movies, songs });
}
}
SongsAPI.ts
:
import { RESTDataSource } from 'apollo-datasource-rest';
export class SongsAPI extends RESTDataSource {
async getSongs() {
return ['x', 'y'];
}
}
从客户端发送一个GraphQL查询。
query{
movies
}
响应有效载荷。
{
"data": {
"movies": "{\"movies\":[\"a\",\"b\"],\"songs\":[\"x\",\"y\"]}"
}
}
包版本: "apollo-datasource-rest": "^0.8.1"
, "apollo-server": "^2.12.0"
源码。https:/github.commrdulinapollo-graphql-tutorialtreemastersrcstackoverflow61425326。