Почему это свойство GraphQL не возвращает ожидаемое значение, когда я вызываю его родителя?

Итак, я пытаюсь создать приложение для перебора закладок, которые я сохранил в Google Firestore. Я получаю доступ к Firestore через сервер Apollo.

Вот мои преобразователи и определения типов.

import { gql } from 'apollo-server-express';
import * as admin from 'firebase-admin';

const serviceAccount = require('./service-account.json')
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

// Locations of bookmarks in database
const bookmarks = admin.firestore().collection("bookmarks");

export const typeDefs = gql`
type Bookmark {
    name: String
    url: String
    preview: Preview
}

type Preview {
    bookmark: Bookmark
    description: String
    image: String
}

type Query {
    bookmarks: [Bookmark]
    hello: String
}

schema {
    query: Query
}
`;

export const resolvers = {
    Query: {
        hello(obj, args, context, info) {
            return 'Hello world!'
        },
        async bookmarks() {
            const firebaseList= await bookmarks.get();
            return firebaseList.docs.map(bookmark => bookmark.data());
        }
    },

    Preview: {
        description: () => "this is a description",
    }
};

Когда я отправляю этот запрос:

{bookmarks{
  name
  url
  preview {
    description
  }
}}

Я хочу, чтобы он возвращал описание предварительного просмотра (очевидно), но я получаю

{
  "data": {
    "bookmarks": [
      {
        "name": "Google",
        "url": "https://google.com",
        "preview": null
      },
      {
        "name": "Facebook",
        "url": "https://facebook.com",
        "preview": null
      },
      {
        "name": "Instagram",
        "url": "https://instagram.com",
        "preview": null
      },
      {
        "name": "Pinterest",
        "url": "https://pinterest.com",
        "preview": null
      }
    ]
  }
}

Что я неправильно понимаю в работе GraphQL?

Содержат ли данные, возвращаемые из firebase для каждой закладки, свойство с именем preview?

Daniel Rearden 18.03.2019 23:09

нет, это не так, хотя это было не по недосмотру. Моя цель для этого кода состояла в том, чтобы в конечном итоге заполнить свойство preview метатегами Open Graph, взяв url в качестве параметра без необходимости хранить все эти данные в Firebase. Моим первым решением было сделать это в браузере, но я столкнулся с CORS, поэтому пытаюсь найти лучший способ сделать это на сервере.

Earl Man 18.03.2019 23:32

Фактически это та же проблема, что описана в здесь и здесь. Вам нужно добавить преобразователь для поля preview, который возвращает пустой объект. Для получения более подробной информации см. ответы в вышеупомянутых сообщениях.

Daniel Rearden 19.03.2019 02:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
3
24
0

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