gpt4 book ai didi

typegraphql - 如何使用 type-graphql 和 RESTDataSource

转载 作者:行者123 更新时间:2023-12-04 11:04:09 24 4
gpt4 key购买 nike

我想知道如何在 type-graphql 中使用 RESTDataSource 并因此在 redis 中正确缓存。我会很感激一个小例子。

目前我使用 DI 容器来获取一个服务,该服务是从 RestDataSource 类扩展而来的,但这不是正确的方法。

BookmarkResolver.ts

import { Resolver, FieldResolver, Root, Query, Ctx, Authorized } from 'type-graphql';
import { DealService } from '../service/DealService';
import { AvailableLocale } from '../enum/AvailableLocale';
import { Bookmark } from '../entity/Bookmark';

@Resolver(_of => Bookmark)
export class BookmarkResolver {
constructor(private dealService: DealService) {}

@FieldResolver()
async wordpressDeal(@Root() bookmark: Bookmark) {
return await this.dealService.getDealById(bookmark.item_id, AvailableLocale.STAGING);
}
}

DealService.ts
import { Service } from 'typedi';
import { AbstractService } from './AbstractService';
import { AvailableLocale } from '../enum/AvailableLocale';

@Service()
export class DealService extends AbstractService {
baseURL = process.env.DEAL_SERVICE_URL;

async getDealById(dealId: string | number, locale: AvailableLocale) {
const response = await this.get(
'deals/' + dealId,
{ locale }
);

return this.dealReducer(response);
}

dealReducer(deal: any) {
return {
id: deal.id || 0,
title: deal.title
};
}
}

抽象服务.ts
import { RESTDataSource, HTTPCache } from 'apollo-datasource-rest';
import { Service } from 'typedi';

@Service()
export class AbstractService extends RESTDataSource {
constructor() {
super();
this.httpCache = new HTTPCache();
}
}

最佳答案

分享 RESTDataSource通过 ApolloServer的上下文。通过使用 @Ctx() 访问上下文,在解析器中使用它装饰器。
1.定义一个RESTDataSource
根据apollo-datasource-rest example定义数据源.

export class TodoDataSource extends RESTDataSource {
constructor() {
super();
this.baseURL = "https://jsonplaceholder.typicode.com/todos";
}

async getTodos(): Promise<Todo[]> {
return this.get("/");
}
}
2.创建DataSource的实例并放入Context
启动服务器时, add data sources to the context通过定义一个创建数据源的函数。
const server = new ApolloServer({
schema,
playground: true,
dataSources: () => ({
todoDataSource: new TodoDataSource(),
}),
});
3.访问解析器中的DataSource
使用 @Ctx()装饰器访问解析器中的上下文,以便您可以使用数据源。
@Resolver(Todo)
export class TodoResolver {
@Query(() => [Todo])
async todos(@Ctx() context: Context) {
return context.dataSources.todoDataSource.getTodos();
}
}
完整的、可运行的示例位于 https://github.com/lauriharpf/type-graphql-restdatasource

关于typegraphql - 如何使用 type-graphql 和 RESTDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59682119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com