Мой интерфейс — 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?
эй, @JVLobo - я обновил свой вопрос.
круто, теперь понятнее :) Я отправил ответ, надеюсь, это поможет
Я бы не стал использовать полнофункциональный клиент для выполнения запросов на стороне сервера. Вместо этого вы можете использовать что-то очень простое, например graphql-запрос.





Поскольку вы получаете 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';
Я углубляюсь в это сейчас... apollographql.com/docs/link/links/http.html
Как я могу потребовать createHttpLink ?
Я думаю, что-то вроде const HttpLink = require("apollo-link-http").HttpLink; или const { HttpLink } = require('apollo-link-http'); должно это сделать.
Скорее всего, это то, что вы ищете:
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.
Вы можете использовать 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 },
}),
})
привет шанс, не могли бы вы объяснить немного больше о вашей проблеме? Я не понимаю... вы сказали, что использовали
react-apollo(сторона React...), но тогда вы не знаете, как делать запросы из React? Я не понимаю.