Приложение ретрансляции: Как проанализировать схему на сервере?

Я играю с реле-стартером. Я также использовал Сангрию для создания сервера GraphQL. Теперь я пытаюсь соединить их вместе.

В relay-starter-kit каждый раз, когда вы изменяете схему, вам нужно запускать скрипт для регенерации файла schema.json. Но поскольку graphql поддерживает интроспекцию схемы, мне интересно, есть ли способ настроить мое приложение-ретранслятор так, чтобы оно анализировало схему с сервера при запуске.

Кто-нибудь знает, возможно ли это или разработали, как это сделать?

3 ответа

Определите файл babelRelayPlugin.js (который запускается веб-пакетом при проверке клиентских запросов graphql) следующим образом:

var babelRelayPlugin   = require('babel-relay-plugin');
var introspectionQuery = require('graphql/utilities').introspectionQuery;
var request            = require('sync-request');

var url = 'http://localhost:3000/graphql';

var response = request('POST', url, {
   qs: {
      query: introspectionQuery
   }
});

var schema = JSON.parse(response.body.toString('utf-8'));

module.exports = babelRelayPlugin(schema.data, {
   abortOnError: true,
});

Конечно, измените переменную url на любую ссылку сервера, которую вы используете для разработки. В веб-пакете включите следующее в определение ваших загрузчиков:

query: {stage: 0, plugins: ['./babelRelayPlugin']}

и укажите расположение вышеуказанного файла babelRelayPlugin.js.

Похоже, нам нужно что-то вроде этого (из https://github.com/facebook/relay/blob/master/scripts/jest/updateSchema.js#L25):

import { buildASTSchema, introspectionQuery } from 'graphql/utilities';

var body = fs.readFileSync(inFile, 'utf8');
var ast = parseSchemaIntoAST(body);
var astSchema = buildASTSchema(ast, 'Root', 'Mutation');
graphql(astSchema, introspectionQuery).then(
    function(result) {
      var out = JSON.stringify(result, null, 2);
      fs.writeFileSync(outFile, out);
});

Продукт самоанализа (schema.json) используется плагином Babel Relay для проверки и компиляции Relay.QL выражения. К счастью, метод getBabelRelayPlugin принимает либо продукт интроспекции, либо функцию, которая возвращает продукт интроспекции.

Тогда должно быть возможно сделать что-то подобное в системе сборки вашего приложения (например, Webpack):

// Pseudocode
var SCHEMA_PATH = 'path/to/schema.js';
var introspectionProduct = introspectSchema(SCHEMA_PATH);

watch(SCHEMA_PATH, () => introspectionProduct = introspectSchema(SCHEMA_PATH));

var babelRelayPlugin = getBabelRelayPlugin(() => introspectionProduct);
Другие вопросы по тегам