#node.js #typescript #graphql #nestjs #typeorm
#node.js #typescript #graphql #nestjs #typeorm
Вопрос:
Я новичок в NestJS, Graphql, typescript.
Мне нужно выполнить внешний вызов API, который в основном является самим запросом Graphql, при необходимости изменить ответ и вернуть ответ на исходный запрос / запрос, в данном случае test
это имя запроса.
У меня есть следующий код
@Query(returns => BlogPost) // @objectType
async test() {
const endpoint = 'https://testing.org/api/content/project-dev/graphql'
const graphQLClient = new GraphQLClient(endpoint, {
headers: {
authorization: 'Bearer xxxx',
},
})
const query = gql`
{
queryContentContentsWithTotal(top: 10) {
total
}
}`
const data = await graphQLClient.request(query)
console.log(JSON.stringify(data, undefined, 2))
return data;
}
Это то BlogPost
ObjectType
, что выглядит как :
import { Field, ObjectType } from '@nestjs/graphql';
@ObjectType()
export class BlogPost {
@Field({ nullable: true })
total!: number;
}
Я разместил консоль.также войдите, чтобы увидеть ответ на вызов внешнего API, который:
{
"queryContentContentsWithTotal": {
"total": 1
}
}
но ответ Graphql на запрос :
{
"data": {
"test": {
"total": null // this needs to be 1
}
}
}
total
равно null, если вызов API возвращает total
значение 1;
Как здесь можно гибко выполнить сопоставление, чтобы ответ на запрос выглядел одинаково?
Ответ №1:
GraphQL ожидает ваших возвращаемых данных в виде
{
"total": "number of some sort"
}
Но на самом деле вы возвращаете данные в форме
{
"queryContentContentsWithTotal": {
"total": 1
}
}
Таким образом, движок GraphQL не может понять возвращаемый тип. Вам необходимо сопоставить ваши данные с правильным возвратом следующим образом:
@Query(returns => BlogPost) // @objectType
async test() {
const endpoint = 'https://testing.org/api/content/project-dev/graphql'
const graphQLClient = new GraphQLClient(endpoint, {
headers: {
authorization: 'Bearer xxxx',
},
})
const query = gql`
{
queryContentContentsWithTotal(top: 10) {
total
}
}`
const data = await graphQLClient.request(query)
console.log(JSON.stringify(data, undefined, 2))
return data.queryContentContentsWithTotal;
}
Ответ №2:
Вы возвращаете data
не тот тип, который BlogPost
. Вместо этого вы должны вернуть это
return {total: data.queryContentContentsWithTotal.total}