使用Apollo Server的dataSources配置选项有什么好处?

时间:2019-07-01 15:48:29

标签: javascript typescript graphql apollo apollo-server

在使用Apollo Server docs on dataSources之后,将假定在GraphQL解析器中访问数据的最佳方法是通过服务器配置上的dataSources选项。

但是,我正在使用的应用程序具有导致多种不同数据源类的要求(在下面的 handler.ts 文件中被截断为...,但大约有10个现在,将来还会有更多)。这意味着将为服务器收到的每个查询/突变实例化每个数据源类,我想如果我有足够的数据源类,最终可能会导致一点延迟。

我正在考虑不使用dataSources选项,而是根据需要通过使用解析器上下文在Apollo initialize()类上调用RESTDataSource方法来实例化每个数据源类(下面粘贴的示例解析器方法),它似乎为dataSources config选项提供的数据源类提供了所有相同的功能。

我想知道:

  • 使用我不知道的dataSources选项有什么好处/缺点吗?
  • 为什么Apollo文档会鼓励您为每个请求实例化所有数据源类?

在此先感谢您提供任何见解!

handler.ts 中的服务器配置:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  introspection: true,
  playground: true,
  dataSources: (): IDataSources => {
    return {
      entity: new Entity(),
      notes: new Notes(), // this could be removed if "new" resolver method is used
      ... // like 8 more data sources go here
    };
  },
  context: ({
    event,
    context
  }: {
    event: APIGatewayEvent;
    context: Context;
  }): IGraphqlServerOptionContext => {
    const user = new User(event);
    return { apiGatewayEvent: event, apiGatewayContext: context, user };
  },
  extensions: [() => new LogFunctionExtension()]
});

resolvers.ts 中的示例(替代)解析器方法:

export const resolvers: IResolvers<any, IResolverContext> = {
  Query: {
    getNotes: async (
      _source,
      args: QueryGetNotesArgs,
      resolverContext: IResolverContext
    ) => {
      validateRequestHeaders('common', resolverContext.apiGatewayEvent);
      // old method of accessing notes data source class:
      // const {
      //   dataSources: { notes }
      // } = resolverContext;

      // new method of accessing notes data source class:
      const notes = new Notes(resolverContext);

      return notes.getNoteDetails(args);
    },
  }
};

新的Notes数据源类构造函数:

export default class Notes extends RESTDataSource<IDataSourceContext> {
  constructor(inputContext: IDataSourceContext) {
    this.initialize({
      context: inputContext,
      cache: new InMemoryLRUCache()
    });
  }
}

0 个答案:

没有答案