Определение источников данных сервера apollo вызывает ошибку

У меня возникают трудности с созданием источника данных REST с использованием сервера Apollo graphql У меня есть файл data.js для определения источника данных REST следующим образом:

    const { RESTDataSource } = require('apollo-datasource-rest');

    class MyAPI extends RESTDataSource {
        constructor() {
            super();
            this.baseURL = 'https://my-end-point;
        }

        async fetchData(what) {
           return this.get(`myparam`);
        }
   }

Затем я импортирую это в resolver.js следующим образом:

const myAPI = require('./data');
export const resolvers = {
     Query: {
          field () => {
             return myAPI.fetchData(param);
           }
     }
}

Когда я запускаю это, появляется следующая ошибка:

myAPI.fetchData is not a function

Некоторая информация была бы очень полезной.

Как вы экспортируете MyAPI внутри data.js?

Daniel Rearden 26.10.2018 17:03

module.exports = myAPI;

radhikavm 28.10.2018 22:33
0
2
946
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш модуль экспортирует класс, и это то, что вы импортируете, но вы никогда не создаете его экземпляр. Вам необходимо получить экземпляр MyAPI, позвонив в new MyAPI(). Затем вы можете вызвать в fetchData на этом экземпляре. Просто обновите свой модуль, чтобы экспортировать экземпляр:

module.exports = new myAPI()

Да, спасибо, это работает, но теперь я, как правило, получаю еще одну ошибку

radhikavm 28.10.2018 23:28

Конструктор класса RESTDataSource не может быть вызван без 'new', я думаю, это как-то связано с моим .babelrc -> { "presets": [ "env", "stage-0" ] }

radhikavm 28.10.2018 23:29

как следующее: github.com/apollographql/apollo-server/issues/1217 добавил следующее в .babelrc { "presets": [["latest-node", { "target": "current" }]] } работал у меня

radhikavm 29.10.2018 02:30

@RadhikaMogarkar Рад, что у вас все получилось! Если этот ответ помог решить ваш вопрос, отметьте его как принятый. Спасибо!

Daniel Rearden 29.10.2018 02:41

Привет, ваш вопрос неоднозначен, но позвольте мне ответить на него с помощью некоторых структур, которые могут соответствовать вашим данным,

несколько рабочих примеров:

const { RESTDataSource } = require('apollo-datasource-rest');

class exampleAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = "http://Endpoint";
  }

async allProperties() {
const fetch = await this.get("xml.php?cl="); // incase your endpoint looks like this.
return fetch.properties;
}

async getAllProperties() {
const  response = await this.allProperties(); // you can pass the above function into a new function.
return Array.isArray(response)
? response.map((item) => this.propertyReducer(item))
: []
}

// incase your end point is not an array then you need to include a ! boolean in the return Array.isArray.
async getAllProperties() {
const  response = await this.allProperties(); // you can pass the above function into a new function.
return !Array.isArray(response)
? response.properties.map((item) => this.propertyReducer(item))
: []
}

или

const { RESTDataSource } = require('apollo-datasource-rest');

class PropertytwoAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = ""
  }

  async getAllData() {
    const response = await this.get("Data");
    return !Array.isArray(response)
    ? response.documents.map((item, index) => this.propertyReducer(item))
    : []
   }


  propertyReducer(item, index){
    return {
       id : [index] - 0,
       fields : {
        Rent_Frequency : {
           stringValue : item.fields.Rent_Frequency.stringValue,
         },
        geopoints : {
           geoPointValue : {
              latitude  : item.fields.geopoints.geoPointValue.latitude,
              longitude : item.fields.geopoints.geoPointValue.longitude,
           }
       },
       Images : {
          arrayValue : {
            values : item.fields.Images.arrayValue.values.map(i => ({
            stringValue : i.stringValue
            })),
          }
      },
       Property_Size : {
         stringValue : item.fields.Property_Size.stringValue,
       },
       Property_purpose :  {
         stringValue : item.fields.Property_purpose.stringValue,
       },
       Property_Description :  {
        stringValue : item.fields.Property_Description.stringValue,
       },
       Price : {
          stringValue : item.fields.Price.stringValue,
       },

       Property_Size_Unit :  {
         stringValue : item.fields.Property_Size_Unit.stringValue,
       },
       Locality :  {
         stringValue : item.fields.Locality.stringValue,
       },
       Property_Type : {
         stringValue : item.fields.Property_Type.stringValue,
       },
       Listing_Agent :   {
         stringValue : item.fields.Listing_Agent.stringValue,
       },
       Listing_Agent_Phone : {
         stringValue : item.fields.Listing_Agent_Phone.stringValue,
       },
       Property_Title :  {
         stringValue : item.fields.Property_Title.stringValue,
       },
       Bathroom :  {
         stringValue : item.fields.Bathroom.stringValue,
       },
       Listing_Agent_Email :  {
         stringValue : item.fields.Listing_Agent_Email.stringValue,
       },
       Bedrooms :  {
         stringValue : item.fields.Bedrooms.stringValue,
       },
       City :  {
         stringValue : item.fields.City.stringValue,
       },
       Property_Status :  {
         stringValue : item.fields.Property_Status.stringValue,
       },
       Sub_Locality :  {
         stringValue : item.fields.Sub_Locality.stringValue,
       },
     }
     }
    }
  }



module.exports = PropertytwoAPI;

резолверы:

const { paginateResults } = require('./utils');


module.exports = {
    Query : {

    properties: async (_, {limit = 20, after}, {dataSources}) => {
      const allProperties = await dataSources.propertyAPI.getAllProperties();
      allProperties;
      const properties = paginateResults({
        after,
        limit,
        results: allProperties
      });
      return {
        properties,
        cursor : properties.length ? properties[properties.length -1].cursor : null,
        hasMore : properties.length
        ? properties[properties.length -1].cursor !==
        allProperties[allProperties.length -1].cursor
        : false
      };
    },

    propertytwo : (_, __, {dataSources}) =>
      dataSources.propertytwoAPI.getAllData(),

    property: (_, { id }, { dataSources }) =>
      dataSources.propertyAPI.getPropertyById({ propertyId: id }),

       },

    },




  };

вы можете обратиться к этому файлу github: https://github.com/trackmystories/apollo-server-RESTDataSource

и вот статья, которую я написал, посвященную некоторым вопросам понимания в документации apollo

https://medium.com/@ashirazee/array-isarray-response-returns-null-apollo-graphql-e9132cc98153

Другие вопросы по теме