Я новичок в typeGraphQL и мой вопрос о возможности подсчета элементов списка результатов
У меня есть тип модели Книги
import { Field, ID, ObjectType, Root } from "type-graphql";
import { Model, Column } from "sequelize-typescript";
@ObjectType()
export default class Books extends Model<Books>
{
@Field(() => ID)
@Column
id: number;
@Field(() => String)
@Column
bookName: string;
}
Запрос в Resolver
@Query(() => [Books])
async getBooks()
{
return Books.findAll()
}
при выполнении запроса в graphiQL
getTest
{
id
bookName
}
получить ответ
"getBooks" :
[
{
"id": "1",
"bookName": "bookOne"
},
{
"id": "2",
"bookName": "bookTwo"
}
]
Но мне нужно добавить дополнительное поле, например, получить totalCount всех полученных элементов.Как это сделать правильно?Теперь нам нужно создать отдельный запрос, но для больших выборок это довольно неудобно и приводит к дублированию сложных и больших запросов
@Query(() => [Books])
async countBooks()
{
return Books.findAll().length
}
Я попытался создать отдельный тип объединения для числа элементов иСама модель
@ObjectType()
export default class UnionType extends Model<UnionType>
{
@Field(() => [Books])
books: Books[];
@Field(() => Int)
totalCount(@Root() parent : UnionType) : number
{
return parent.books.length;
}
}
и выполнить следующий запрос в resolver
@Query(() => [UnionType])
async getBooksAndCountAll()
{
let union : any = {}
union.books = Books.findAll();
union.totalCount = union.books.length;
return union;
}
Но есть ошибка в GraphiQL при выполнении запроса error "message": "Expected Iterable, but did not find one for field Query.getBooks.",
, как я понимаю, не передаются данные, которые модельожидает
Я пытаюсь использовать createUnionType
import { createUnionType } from "type-graphql";
const SearchResultUnion = createUnionType({
name: "Books", // the name of the GraphQL union
types: [Books, CountType], // array of object types classes
});
, где UnionType
@ObjectType()
export default class CountType extends Model<CountType>
{
@Field(() => Int, { nullable : true })
totalCount: number;
}
Запрос в Resolver
@Query(returns => [SearchResultUnion])
async getBooks(
): Promise<Array<typeof SearchResultUnion>>{
return new Promise((resolve, reject) => {
Books.findAll()
.then(books => {
let totalCount = books.length;
return [...books, ...totalCount];
});
});
}
Но естьошибка в строке return [...books, ...totalCount];
на ...totalCount
Type 'number' must have a '[Symbol.iterator]()' method that returns an iterator.
Если вы не передаете ...totalCount
запрос работает, но соответственно нет уже totalCount
getTest{
__typename
... on Books
{
id
bookName
}
}
запрос
"getBooks": [
{
"id": "1",
"bookName": "bookOne"
},
{
"id": "2",
"bookName": "bookTwo"
}
]
Итак, в результате мне нужен запрос
getTest
{
totalCount
__typename
... on Books{
id
bookName
}
}
Возможно ли это?