Apollo RESTDataSource调用其他RESTDataSource?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apollo RESTDataSource调用其他RESTDataSource?相关的知识,希望对你有一定的参考价值。

假设我有2个扩展RESTDataSource的API类。

class MoviesAPI extends RESTDataSource 
async getMovies() 


class SongsAPI extends RESTDataSource 
async getSongs() 

我怎么能调用 getSongsgetMovies 在现有的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。

以上是关于Apollo RESTDataSource调用其他RESTDataSource?的主要内容,如果未能解决你的问题,请参考以下文章

RESTDataSource - 如何知道响应来自获取请求还是缓存

使用 type-graphql 和 RESTDataSource 为第二个 api 调用添加字段解析器

无法读取未定义的属性“获取”

使用 RESTDataSource 为 GET 请求设置“参数”

Apollo GraphQL:未在突变子字段上调用解析器

用 Jest 测试 TypeScript:“没有重载匹配这个调用”