NestJS 数据载入器
NestJS 数据装载器简化添加 图表ql/数据加载器 到你的巢穴JS项目。 DataLoader旨在解决常见的N+1加载问题.
这是krislefeber/nestjs-dataloader的叉子,有以下变化:
- 在接口中将生成DataLoader方法替换为 getBatchFunction, 减少从数据装入包中导入任何内容的需要并简化代码
- 已添加
sortDataLoaderResultsByKey方便方法,因为一些批量方法可以使用(例如:SELECT * IN (...))不保证返回结果的顺序与所提供的密钥的顺序相匹配,这对数据装入器正常工作至关重要 - 将所有依赖性更新到最新版本
安装
npm i @applifting-io/nestjs-dataloader
使用量
NestData Loader 创建
我们首先执行 NestDataLoader 接口。 这说明 DataLoader 如何装入我们的物体.
import { Injectable } from '@nestjs/common';
import { NestDataLoader, DataLoaderBatchFunction } from '@applifting-io/nestjs-dataloader';
...
@Injectable()
export class AccountLoader implements NestDataLoader<string, Account> {
constructor(private readonly accountService: AccountService) { }
getBatchFunction(): DataLoaderBatchFunction<string, Account> {
return (keys: string[]) => {
const results = await this.accountService.findByIds(keys);
return sortDataLoaderResultsByKey(keys, results, "id");
};
}
}
界面的第一个通用是数据存储器使用的ID类型. 第二个通称是返回对象的类型. 在上述情况下,我们希望 DataLoader 返回实例 Account 课.
提供 NestData 记录器
对于我们创建的NestDataLoader, 我们需要提供它的模块.
import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { DataLoaderInterceptor } from 'nestjs-dataloader'
...
@Module({
providers: [
AccountResolver,
AccountLoader,
{
provide: APP_INTERCEPTOR,
useClass: DataLoaderInterceptor,
},
],
})
export class ResolversModule { }
使用 NestData 记录器
现在我们有了一个数据装入器,我们的模块意识到了这一点,我们需要把它作为参数传递到我们的图QL解析器中的一个终点.
import * as DataLoader from 'dataloader';
import { Loader } from 'nestjs-dataloader';
...
@Resolver(Account)
export class AccountResolver {
@Query(() => [Account])
public getAccounts(
@Args({ name: 'ids', type: () => [String] }) ids: string[],
@Loader(AccountLoader) accountLoader: DataLoader<Account['id'], Account>): Promise<Account[]> {
return accountLoader.loadMany(ids);
}
}
需要指出的是, 参数 @Loader 装饰者是 NestDataLoader 我们想被注射到方法。 DataLoader 图书馆将处理批量检索和缓存我们的请求。 注意:缓存按需存储.
捐款
总是欢迎拉动请求。 对于重大变动,请先开出一个问题来讨论你想要改变什么.