javascript - Apollo RESTDataSource 调用其他 RESTDataSource?
问题描述
假设我有 2 个扩展 RESTDataSource 的 API 类:
class MoviesAPI extends RESTDataSource {
async getMovies() {}
}
class SongsAPI extends RESTDataSource {
async getSongs() {}
}
如何getSongs
从getMovies
现有的 Apollo 服务器上下文中调用?
解决方案
this.context
您可以通过在数据源类中获取 apollo 服务器上下文并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.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/61425326
推荐阅读
- python - 如果值重叠,则合并 pandas dfs 列,否则分配默认值
- flutter - 仅当用户向下滑动时如何显示小部件?
- blockchain - 通过 WSS 连接到在本地网络上运行的 Polkadot Full Node 失败
- reactjs - rxjs 可观察捕获错误上缺少“body”属性
- lua - “内存分配错误:块太大”做简单的整数除法
- ngx-admin - ngx-admin 卡片填充和边距
- terraform - 我们如何从 terraform gcp 资源 iam 绑定中的变量添加项目编号
- python - 通过阈值使用通用句子编码器的句子相似度
- ruby-on-rails - 即使禁用缓存,Rails 仍会缓存视图/控制器
- c# - C# 解析 JSON 对象