Как вернуть значения обещаний Firebase в graphql? - PullRequest
0 голосов
/ 18 июня 2020

Итак, я добавил Firebase в свой проект реакции. Я могу console.log () значения, но я застрял. Как я могу получить значение из .then в graphql.

Это мои настройки в верхней части страницы.

const fs = require('fs');
const { ApolloServer, gql } = require('apollo-server-express');
const express = require('express');
const firebase = require('firebase/app');
require('firebase/firestore');


const  config = {
  apiKey: "#################",
  authDomain: "#################",
  databaseURL: "#################",
  projectId: "#################",
  storageBucket: "#################",
  messagingSenderId: "#################",
  appId: "#################",
  measurementId: "#################"
};

firebase.initializeApp(config);

const firestore = firebase.firestore()

Я использовал этот метод в redux, и он работает. Теперь я пытаюсь получить его в graphql.

export const getFirebasePage = () => {

  const firbasePageRef = firestore.collection('pages');

  return firbasePageRef.get()
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
          // doc.data() is never undefined for query doc snapshots
          const { title, meta, sections } = doc.data();

          return {
            routeName: encodeURI(title.replace(/\s+/g, '-').toLowerCase()),
            id: doc.id,
            meta,
            sections,
            title
          };

      });
  })
  .catch(function(error) {
      console.log("Error getting documents: ", error);
  });

}

После успешного выполнения обещания я хотел бы иметь возможность добавлять значения в graphql вот так.

//resolver
const Query = {
  page: (root, {id}) => ValueFromPromise.pages.get(id)
}


//schema
type Query {
  page(id: ID!): Page
}

type Page{
  id:ID!
  routName: String!,
  meta: [Episode!]!,
  sections: [Episode!]!,
  title, String!
}

Как я могу это сделать? Можно ли это сделать внутри преобразователя следующим образом:

const resolvers = {
  Query: {
    pages: firbasePageRef.get()
    .then(function(querySnapshot) {
        return querySnapshot.forEach(function( doc) {
            // doc.data() is never undefined for query doc snapshots
            const { title, meta, sections } = doc.data();
            const data = {
              routeName: encodeURI(title.toLowerCase()),
              id: doc.id,
              meta,
              sections
            };
            console.log(data); //The correct data is login here. I think I need a resolver or another .then. This is were i'm stuck!
            return data;
        });
    }).then(function(results){
       return results;
    })
  }
};

Мой запрос на игровой площадке graphql выглядит так

query{
  pages{
    title
  }
}

И мои результаты выглядят так

{
  "data": {
    "pages": null
  }
}

Когда я регистрирую револьверы, я получаю это

{ Query: { pages: Promise { <pending> } } }

1 Ответ

1 голос
/ 19 июня 2020

Приложив упорный труд и решительность, я смог решить эту проблему. В функции .then я определил вызов нового массива let newQueryData = [];, а в функции .forEach я добавил новый массив newQueryData.push(data); и, наконец, вернул новый массив return newQueryData;. Другой .then мне не понадобился. Вот мой последний код.

Я взял большую часть кода из резолвера graphql вот так;

const firbasePageRef = firestore.collection('pages');
const getPagePromise = firbasePageRef.get()
.then((querySnapshot) => {
  let newQueryData = [];
    const queryData = querySnapshot.forEach(function( doc) {
        // doc.data() is never undefined for query doc snapshots
        const { title, meta, sections } = doc.data();
        const data = {
          routeName: encodeURI(title.toLowerCase()),
          id: doc.id,
          meta,
          sections,
          title
        };
        newQueryData.push(data);
    })

    return newQueryData;

});

Затем я отредактировал резолвер graphql так:

const resolvers = {
  Query: {
    pages: () => getPagePromise
  }
};

Вот и мои результаты в графической игровой площадке!

{
  "data": {
    "pages": [
      {
        "title": "Home Page"
      }
    ]
  }
}

Ребята, я надеюсь, что это поможет всем, у кого такая же или похожая проблема. Это Firebase для graphql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...