在使用Apollo Server docs on dataSources之后,将假定在GraphQL解析器中访问数据的最佳方法是通过服务器配置上的dataSources
选项。
但是,我正在使用的应用程序具有导致多种不同数据源类的要求(在下面的 handler.ts 文件中被截断为...
,但大约有10个现在,将来还会有更多)。这意味着将为服务器收到的每个查询/突变实例化每个数据源类,我想如果我有足够的数据源类,最终可能会导致一点延迟。
我正在考虑不使用dataSources
选项,而是根据需要通过使用解析器上下文在Apollo initialize()
类上调用RESTDataSource
方法来实例化每个数据源类(下面粘贴的示例解析器方法),它似乎为dataSources
config选项提供的数据源类提供了所有相同的功能。
我想知道:
dataSources
选项有什么好处/缺点吗?在此先感谢您提供任何见解!
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()
});
}
}