NestJS: возвращает измененный ответ на основе внешнего вызова API

#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}