中继应用:如何在服务器上内省架构?

时间:2015-08-24 09:16:38

标签: facebook reactjs relayjs graphql sangria

我正在玩relay-starter-kit。我还使用sangria创建了一个graphql服务器。现在,我试图将两者连接在一起。

在relay-starter-kit中,每次更改架构时,都需要运行脚本来重新生成schema.json文件。但是由于graphql支持模式内省,我想知道是否有一种方法可以配置我的中继应用程序,以便在启动时从服务器内省模式。

是否有人知道这是否可行或是如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

定义一个babelRelayPlugin.js(在验证客户端graphql查询时由webpack运行):

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变量更改为用于开发的任何服务器URL。 在webpack中,在加载器定义中包含以下内容:

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

并指向上述babelRelayPlugin.js文件的位置。

答案 1 :(得分:2)

看起来我们需要这样的东西(来自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);
});