Как вызвать запрос/мутацию GraphQL с сервера Express?

Мой интерфейс — localhost:3000, а мой сервер GraphQL — localhost:3333.

Я использовал react-apollo для запроса/мутации в стране JSX, но еще не делал запрос/мутацию из Express.

Я хотел бы сделать запрос/мутацию здесь, в моем server.js.

server.get('/auth/github/callback', (req, res) => {
  // send GraphQL mutation to add new user
});

Ниже кажется правильным направлением, но я получаю TypeError: ApolloClient is not a constructor:

const express = require('express');
const next = require('next');
const ApolloClient = require('apollo-boost');
const gql = require('graphql-tag');


// setup
const client = new ApolloClient({
  uri: 'http://localhost:3333/graphql'
});
const app = next({dev});
const handle = app.getRequestHandler();

app
  .prepare()
  .then(() => {
    const server = express();

    server.get('/auth/github/callback', (req, res) => {
      // GraphQL mutation
      client.query({
        query: gql`
          mutation ADD_GITHUB_USER {
            signInUpGithub(
              email: "[email protected]"
              githubAccount: "githubusername"
              githubToken: "89qwrui234nf0"
            ) {
              id
              email
              githubToken
              githubAccount
            }
          }
        `,
      })
        .then(data => console.info(data))
        .catch(error => console.error(error));
    });

    server.listen(3333, err => {
      if (err) throw err;
      console.info(`Ready on http://localhost:3333`);
    });
  })
  .catch(ex => {
    console.error(ex.stack);
    process.exit(1);
  });

В этом посте упоминается Аполлон как решение, но не приводит пример.

Как вызвать мутацию GraphQL с сервера Express :3000 на GraphQL :3333?

привет шанс, не могли бы вы объяснить немного больше о вашей проблеме? Я не понимаю... вы сказали, что использовали react-apollo (сторона React...), но тогда вы не знаете, как делать запросы из React? Я не понимаю.

JV Lobo 07.02.2019 01:01
Рендеринг на стороне сервера
Şivā SankĂr 07.02.2019 08:35

эй, @JVLobo - я обновил свой вопрос.

Chance Smith 07.02.2019 15:02

круто, теперь понятнее :) Я отправил ответ, надеюсь, это поможет

JV Lobo 07.02.2019 22:06

Я бы не стал использовать полнофункциональный клиент для выполнения запросов на стороне сервера. Вместо этого вы можете использовать что-то очень простое, например graphql-запрос.

Thomas Hennes 08.02.2019 14:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
5
4 765
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Поскольку вы получаете ApolloКлиент с require вместо import, я думаю, что вам не хватает этой части:

// es5 or Node.js
const Boost = require('apollo-boost');
const ApolloClient = Boost.DefaultClient;

или

const ApolloBoost = require('apollo-boost');
const ApolloClient = ApolloBoost.default;

Попробуйте один из них и посмотрите, работает ли он.

Второй сделал свое дело, но теперь он ищет fetch: Error: fetch is not found globally and no fetcher passed, to fix pass a fetch for your environment like https://www.npmjs.com/package/node-fetch. >>> For example: import fetch from 'node-fetch'; import { createHttpLink } from 'apollo-link-http';

Chance Smith 07.02.2019 22:27

Я углубляюсь в это сейчас... apollographql.com/docs/link/links/http.html

Chance Smith 07.02.2019 22:31

Как я могу потребовать createHttpLink ?

Chance Smith 07.02.2019 22:58

Я думаю, что-то вроде const HttpLink = require("apollo-link-http").HttpLink; или const { HttpLink } = require('apollo-link-http'); должно это сделать.

JV Lobo 08.02.2019 00:17
Ответ принят как подходящий

Скорее всего, это то, что вы ищете:

const { createApolloFetch } = require('apollo-fetch');

const fetch = createApolloFetch({
    uri: 'https://1jzxrj179.lp.gql.zone/graphql',
});

fetch({
    query: '{ posts { title } }',
}).then(res => {
    console.info(res.data);
});

// You can also easily pass variables for dynamic arguments
fetch({
    query: `
        query PostsForAuthor($id: Int!) {
            author(id: $id) {
                firstName
                posts {
                    title
                    votes
                }
            }
        }
    `,
    variables: { id: 1 },
}).then(res => {
    console.info(res.data);
});

Взято из этого поста, может быть полезно и другим: https://blog.apollographql.com/4-simple-ways-to-call-a-graphql-api-a6807bcdb355

Для тех, кто все еще там, apollo-fetch сейчас официально устарел и больше не будет получать будущие обновления ? Поэтому я бы не советовал следовать этому ответу. Это оставляет принести, аксиомы или даже graphql-запрос как, возможно, лучшие альтернативы. Лично я больше склоняюсь к Prisma graphql-request.

sgarcia.dev 02.08.2019 20:13

Вы можете использовать graphql-запрос, это простой клиент GraphQL.

const { request } = require('graphql-request');

request('http://localhost:3333/graphql', `mutation ADD_USER($email: String!, $password: String!) {
  createUser(email: $email, password: $password) {
    id
    email
  }
}`, {email: '[email protected]', password: 'Pa$$w0rd'})
.then(data => console.info(data))
.catch(error => console.error(error));

Он также поддерживает CORS.

const { GraphQLClient } = require('graphql-request');

const endpoint = 'http://localhost:3333/graphql';
const client = new GraphQLClient(endpoint, {
  credentials: 'include',
  mode: 'cors'
});

client.request(`mutation ADD_USER($email: String!, $password: String!) {
  createUser(email: $email, password: $password) {
    id
    email
  }
}`, {email: '[email protected]', password: 'Pa$$w0rd'})
.then(data => console.info(data))
.catch(error => console.error(error));

Я использую его для проведения тестов E2E.

Я хотел бы добавить еще один способ запроса из экспресса. Это то, с чем я закончил.

установить необходимые пакеты

npm install graphql graphql-tag isomorphic-fetch

записать graphql в отдельный файл (myQuery.js)

const gql = require('graphql-tag');
const query = gql`
    query($foo: String) {
      // Graphql query
    }
}

Основной файл

const { print } = require('graphql/language/printer');
const query = require('./myQuery');
require('isomorphic-fetch');

// other logic

const foo = "bar"
const token = "abcdef"

await fetch('https://example.com/graphql', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'authorization': `Bearer ${token}`,
    },
    body: JSON.stringify({ 
      query: `${print(query)}`,
      variables: { foo },
    }),
})

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