首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphql Api Chuck Norris

Graphql Api Chuck Norris
EN

Stack Overflow用户
提问于 2020-06-12 00:42:45
回答 1查看 327关注 0票数 0

我需要帮助构建包装ChuckNorris.io应用程序接口的GraphQL Api

API应该具有解析所有类别(https://api.chuckmorris.io/jokes/categories) aQuery类型

Api应该具有Query类型,可以解决作为参数给定的随机笑话(https://api.chucknorris.io/jokes/random?category={category})

代码语言:javascript
复制
const express=require('express');
const {ApolloServer,gql}=require('apollo-server-express');
const fetch=require('node-fetch');

const typeDefs=gql`
type Joke{
    icon_url:String,
    id:String,
    url:String
    value: String
}

type Category{
    animal:String
    career:String
    celebrity:String
    dev:String
    explicit:String
    fashion:String
    food:String
    history:String
    money:String
    movie:String
    music:String
    political:Strig
    religion:String
    science:String
    sport:String
    travel:String
}

type Query{
    getCategory(category:String!):Joke
    category:Category
}

`

const resolvers={
  Query:{
 getCategory: async(_,{category})=>{
   const response=await fetch(`https://api.chucknorris.io/jokes/random?category=${category}`)
   return response.json();
  },
 category: async(_,{})=>{
   const response=await fetch('https://api.chucknorris.io/jokes/categories') 
   return response.json();
  }
  }
}


const server= new ApolloServer({typeDefs,resolvers});

const app=express();
server.applyMiddleware({app});

app.listen({port:4000},()=>
console.log('Now browse to http://localhost:4000' + server.graphqlPath)
)
EN

回答 1

Stack Overflow用户

发布于 2020-09-10 22:10:49

对于类型类别的查询应该返回一个字符串列表(数组),因此

代码语言:javascript
复制
export const typeDefs = gql`
    type Joke {
        value: String!
        id:ID!
        icon_url:String!
    }
    type Query {
        getAllCategories:[String!]!
        randomJoke(category: String!):Joke
    }
`;

对于您的解析器,您不需要fetch。apollo提供了连接到外部REST API的数据源。因此,安装npm包“apollo datasource-rest”并将其添加到您的apollo服务器实例中,如下所示

代码语言:javascript
复制
const server = new ApolloServer({
    typeDefs,
    resolvers,
    dataSources: ()=>({
        jokeinstance : new Jokenorris
    })
})

然后为Jokenorris创建数据源类,并适当地导入,或者像您一样在一个src文件中执行所有操作。

代码语言:javascript
复制
import pkg from "apollo-datasource-rest";
const { RESTDataSource } = pkg;

export class Jokenorris extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = "https://api.chucknorris.io/jokes";
  }
  

  async getAllCategories() {
    const res = await this.get("categories");
    return res;
  }

  async getRandomJoke({ category }) {
    const response = await this.get("random", { category: category });
    return response;
  }
}

那么你的解析器看起来就像这样,如果你把所有的东西都分块到一个文件中,你可以忽略导出和导入

代码语言:javascript
复制
 export  const resolvers = {
      Query: {
        allJokeCategories: (_, __, { dataSources }) =>
          dataSources.jokeinstance.getAllCategories(),
          randomJoke: (_, {category}, {dataSources})=>
          dataSources.jokeinstance.getRandomJoke({category:category})
      },
    };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62329303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档