【发布时间】:2019-06-07 09:01:30
【问题描述】:
我正在设置一个使用 TypeORM 的 NestJS GraphQL API,但在实现实体之间的关系时遇到了麻烦。
具体来说,TypeORM 关系运行良好,并且实体在数据库中正确链接。但是,当我尝试查询 API 以获取结果时,问题就出现了。
现在我有 2 个实体,每个实体都有自己的解析器:用户和照片。每个用户可以拥有多张照片,而每张照片仅连接到一个用户(多对一)。
以下是实体与 TypeORM 的链接方式
照片实体,与用户实体有关系
@ManyToOne(type => User, user => user.photos, {
onDelete: 'CASCADE',
})
@JoinColumn()
user: User;
用户实体,完成与照片实体的连接
@OneToMany(type => Photo, photo => photo.user, {
eager: true,
})
photos: Photo[];
此代码有效,让我们检索用户的照片
用户解析器
@ResolveProperty('photos')
async photos(@Parent() user): Promise<Photo[]> {
return await this.service.readPhotos(user.id);
}
用户服务
async readPhotos(userId): Promise<Photo[]> {
return await this.photoRepository.find({
where: {
user: userId
}
});
}
* 请注意,photoRepository 可以通过“用户”字段进行过滤。 *
但是,此代码不起作用。它应该让我们查看连接到照片的用户,而不是返回 null。
图片解析器
@ResolveProperty('user')
async user(@Parent() photo): Promise<User> {
console.log(photo);
return await this.service.readUser(photo.user);
}
此照片解析器似乎包含问题;控制台输出的照片对象表明,虽然@Parent 照片对象的所有静态字段都可用(如 ID、datePublished、URL),但由于某种原因,此处无法访问实际的“用户”字段。所以“photo.user”变量为空。 * 请注意,这似乎表明 photoRepository 无法被“用户”字段过滤/访问。 *
照片服务
async readUser(userId): Promise<User> {
return await this.userRepository.findOne({
where: {
user: userId
}
});
}
由于之前的照片解析器无法访问“用户”字段,因此 userId 为空,因此返回 null。
结论
为什么照片解析器无法访问@Parent 照片“用户”字段?用户服务似乎可以通过“用户”字段进行过滤,但我似乎无法直接访问照片“用户”字段。
感谢您对此提供的任何帮助!这两天我一直在纠结这个……
【问题讨论】:
-
您也可以分享您的 GraphQL 架构吗?特别是您的照片和用户的定义
标签: node.js graphql nestjs typeorm