graphql dataloader 无法读取未定义错误的属性“加载”

Posted

技术标签:

【中文标题】graphql dataloader 无法读取未定义错误的属性“加载”【英文标题】:graphql dataloader Cannot read property 'load' of undefined error 【发布时间】:2021-09-03 01:07:34 【问题描述】:

我想将location_group 表下方存在的位置数据带入。您正在尝试使用DataLoader,因为存在 n + 1 问题。

我以为它已经完成了,但是当我实际运行代码时,我得到了一个Cannot read property 'load' of undefined error。你能告诉我为什么会出现这个错误吗?

Resolver代码:

import 
    Args,
    Context,
    ID,
    Mutation,
    Parent,
    Query,
    ResolveField,
    Resolver
 from '@nestjs/graphql';
import  Location_Group  from 'src/entities/location_group.entity';
import  Location  from 'src/entities/location.entity';
import  LocationDataInput  from 'src/input_graphQl/LocationDataInput.input';
import  LocationGroupDataInput  from 'src/input_graphQl/LocationGroupDataInput.input';
import  LocationService  from './location.service';
import  LocationGroupWhereInput  from 'src/input_graphQl/LocationGroupWhereInput.input';
import  GeoJSONPoint  from 'src/scalar/geoJSONPoint.scalar';
import  LocationConText  from 'src/loader/LocationConText.context';

@Resolver(() => Location_Group)
export class LocationResolver2 
    constructor(private readonly locationService: LocationService) 
    @ResolveField(() => [Location])
    locations(
        @Parent() location_group: Location_Group,
        @Context() ctx: LocationConText
    ): Promise<Location[]> 
        console.log(location_group);
        return ctx.LocationDataLoader.load(location_group.id);
    

DataLoader代码:

import DataLoader from 'dataloader';
import  Location_Group  from 'src/entities/location_group.entity';
import  getRepository  from 'typeorm';

export const LocationDataLoader = () =>
    new DataLoader(async (keys: number[]) => 
        const loc = await getRepository(Location_Group)
            .createQueryBuilder('lg')
            .leftJoinAndSelect('lg.locations', 'locations')
            .where('lg.id IN (:...keys)',  keys )
            .getMany();
        return loc.map((element) => element.locations);
    );

LocationConText代码:

import DataLoader from 'dataloader';
import  Request, Response  from 'express';
import  Location  from 'src/entities/location.entity';

export interface LocationConText 
    req: Request;
    res: Response;
    LocationDataLoader: DataLoader<number, Location[]>;

不使用DataLoader 时的结果值。

使用DataLoader 时的结果值。

【问题讨论】:

【参考方案1】:

我找到了答案。

从“数据加载器”导入数据加载器;

=>

import * as DataLoader from 'dataloader';

很遗憾我在这个问题上花了两天时间。

【讨论】:

以上是关于graphql dataloader 无法读取未定义错误的属性“加载”的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义和未处理的承诺拒绝的属性“捕获”

GraphQL,Dataloader,[ORM or not],有很多关系理解

为GraphQL Server自动生成DataLoader!

如何将 Mongoose 与 GraphQL 和 DataLoader 一起使用?

Apollo GraphQL DataLoader DynamoDb

初始化 Graphql 应用程序时出现 org.dataloader.DataLoaderRegistry 错误