Áko*_*dra 8 typescript graphql nestjs
在 Nest.js Graphql 中,是否可以从解析器获取所需的字段列表?要确定执行哪些连接,不执行哪些连接,例如对于此数据库模式:
Employee
id
employer_id
name
Employer
id
name
Run Code Online (Sandbox Code Playgroud)
如果有以下 graphql 查询:
query {
employees {
id
name
employer {
id
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有必要从数据库中获取/连接雇主数据,因为可以从雇员表访问雇主 ID。
Tim*_*nko 10
基本上,您可以使用 NestJs 中的 @Info https://docs.nestjs.com/graphql/resolvers#graphql-argument-decorators装饰器,它从常规 apollo 解析器返回info参数。
该装饰器将解析后的 GraphQL 查询作为 AST 注入,并允许用户创建更复杂的解析器。
使用 AST 并不简单,因为您需要自己处理所有查询类型(片段、别名、指令等),但幸运的是,市场上有一些库可以在幕后完成所有繁重的工作。
https://www.npmjs.com/package/@jenyus-org/graphql-utils
这也为 NestJS 提供了非常有用的装饰器:
https://www.npmjs.com/package/@jenyus-org/nestjs-graphql-utils
代码
@Query(() => [PostObject])
async posts(
@FieldMap() fieldMap: FieldMap,
) {
console.log(fieldMap);
}
Run Code Online (Sandbox Code Playgroud)
输出
{
"posts": {
"id": {},
"title": {},
"body": {},
"author": {
"id": {},
"username": {},
"firstName": {},
"lastName": {}
},
"comments": {
"id": {},
"body": {},
"author": {
"id": {},
"username": {},
"firstName": {},
"lastName": {}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
https://www.npmjs.com/package/graphql-fields-list
NestJS 中的示例:
{
post { # post: [Post]
id
author: {
id
firstName
lastName
}
}
}
Run Code Online (Sandbox Code Playgroud)
import { fieldsList, fieldsMap } from 'graphql-fields-list';
import { Query, Info } from '@nestjs/graphql';
@Query(() => [Post])
async post(
@Info() info,
) {
console.log(fieldsList(info)); // [ 'id', 'firstName', 'lastName' ]
console.log(fieldsMap(info)); // { id: false, firstName: false, lastName: false }
console.log(fieldsProjection(info)); // { id: 1, firstName: 1, lastName: 1 };
}
Run Code Online (Sandbox Code Playgroud)
https://www.npmjs.com/package/graphql-parse-resolve-info https://github.com/robrichard/graphql-fields
| 归档时间: |
|
| 查看次数: |
3885 次 |
| 最近记录: |