Mykeal Kenny
Mykeal Kenny

Reputation: 71

Why can't I get a usable response from graphql with axios?

I'm successfully authenticating with the server, sending my graphql request and receiving a response. However the response isn't quite right.

This is just a simple nodejs, axios, graphql situation. I can get a correct respose via postman or curl but not with node. I've tried fetch as well to no avail. Am I doing something wrong? This is for the producthunt api, the api explorer is located at here

require('dotenv').config()
const axios = require("axios");
const PH_KEY = process.env.PH_KEY;
const PH_SECRET = process.env.PH_SECRET;
const BASE_URL = process.env.BASE_URL;
const AUTH_URL = process.env.AUTH_URL;
const GRAPHQL_URL = process.env.GRAPHQL_URL;
const PH = axios.create({
  baseURL: BASE_URL,
  responseType: 'json',
  headers: {
    // 'Accept': 'application/json, text/plain, gzip, deflate, */*',
    'Content-Type': 'application/json'
  },
})
let TOKEN = 'Bearer '

const getAuth = async () => {
  return await PH({
    url: AUTH_URL,
    method: "post",
    data: {
      client_id: `${PH_KEY}`,
      client_secret: `${PH_SECRET}`,
      grant_type: "client_credentials"
    }
  })
    .then((res) => {
      console.log('auth status ', res.status)
      return res.data.access_token
    })
    .then((res) => {
      TOKEN += res
      console.log(TOKEN)
    })
    .catch((err) => {
      console.log(err)
    })
  }

const getHunt = async () => {
  await getAuth()
  PH.defaults.headers.common['Authorization'] = TOKEN
  return await PH({
    url: GRAPHQL_URL,
    method: 'post',
    data:
    {
      query: `
            query posts {
  posts(order: RANKING, first: 1) {
    edges {
      node {
        name
        votesCount
        user {
          name
        }
        createdAt
      }
    }
  }
}
            `
    }
  })
  .then((res) => {return res})
    .then((res) => {
      console.log(res.data)
      return res.data
    })
    .catch((err) => {
      console.log(err)
    })
}
const Main = async () => {
  await getHunt()
}
Main()

This is the output I receive in node:

[Running] node "/Users/fireinjun/Work/YAC/yac-ph-tophuntfunction/app.js"
auth status  200
Bearer #################################################
{ data: { posts: { edges: [Array] } } }

Here's what I'm expecting:

{
  "data": {
    "posts": {
      "edges": [
        {
          "node": {
            "name": "Trends by The Hustle",
            "votesCount": 125,
            "user": {
              "name": "Jack Smith"
            },
            "createdAt": "2019-06-04T07:01:00Z"
          }
        }
      ]
    }
  }
}

Upvotes: 4

Views: 793

Answers (1)

Mykeal Kenny
Mykeal Kenny

Reputation: 71

I was accessing the data incorrectly! Apparently I needed to see the res.data.data.posts.edges[0]

Upvotes: 3

Related Questions